
C ++ C中的几种罕见但有用的预编译和宏定义| | C ++ 1中一些罕见但有用的预编译和宏定义: #error语法如下: #error token-sequence主要功能是编译输出编译错误消息token-sequence时,对于程序员来说很方便检查程序中的错误. 例如,以下程序#include" stdio.h" int main(int argc,char * argv []){#定义CONST_NAME1" CONST_NAME1" printf("%s \ n&quot ;, CONST_NAME1); #undef CONST_NAME1 #ifndef CONST_NAME1#错误未定义常量符号CONST_NAME1 #endif {#define CONST_NAME2" CONST_NAME2" printf("%s \ n" CONST_NAME2);} printf("%s \ n" CONST_NAME2); return 0;} in进行编译时,输出诸如编译信息的致命错误C1189: #错误: 未定义常量符号CONST_NAME1 2: #pragma语法格式如下: #pragma令牌序列该指令的功能是触发定义的动作.
如果存在令牌序列,则触发相应的动作,否则将忽略它. 该指令通常由编译系统使用. 例如,在Visual C ++中一次使用#pragma. Net,以防止多次包含相同的代码. 3: #line该命令主要用于强制编译器根据指定的行号开始对源代码重新编号. 调试时,可以根据此规则输出错误代码的确切位置. 格式1的语法如下: #行常量“文件名”其功能是使随后的源代码从指定的行号开始重新开始编号常量,并将当前文件的名称命名为filename. 例如,以下程序如下: #include" stdio.h"无效测试(); #line 10" Hello.c" int main(int argc,char * argv []){#定义CONST_NAME1" CONST_NAME1" printf("%s \ n&quot ;, CONST_NAME1); #undef CONST_NAME1 printf(&“%s \ n" CONST_NAME1); {#define CONST_NAME2" CONST_NAME2" printf("%s \ n" CONST_NAME2);} printf("%s \ n" CONST_NAME2);返回0;} void Test(){printf("%s \ n" CONST_NAME2);}建议使用以下编译信息: Hello.c(15): 错误C2065: ' CONST_NAME1&#39 ;: 未声明的标识符表示当前文件的名称被视为Hello.c,而#line 10" Hello.c"位于的位置被认为是第10行c预编译宏开关,因此它在第15行提示错误.

表2语法格式如下: #line constant它的功能是在编译时准确输出错误代码的位置(行号),但该行号未出现在源程序中,这对于程序员要准确定位. 4: 运算符#和##在ANSI C中,为预编译指令定义了两个运算符#和##. #作用是实现文本替换,例如#define HI(x)printf(“ Hi," #x" \ n”); void main(){HI(John);}程序Hi,John的运行结果在预编译过程中,“ #x"是用表示的字符序列替换x. 在此程序中,x是John,因此将构造一个新字符串“ Hi,John”. ##的作用是串联. 例如#define CONNECT(x,y)x ## y void main(){int a1,a2,a3; CONNECT(a,1)= 0; CONNECT(a,2)= 12; a3 = 4; printf(“ a1 =%d \ ta2 =%d \ ta3 =%d”,a1,a2,a3);}该程序的运行结果为a1 = 0 a2 = 12 a3 = 4将CONNECT(a,1)转换为a1,将CONNECT(a,2)转换为a2.
================================================ ==== ==============#define和#undef用于定义常量,宏,并分别取消常量和宏. #include用于包含文件: #include<之间的区别

================================================ ==== ================条件编译系列: 条件编译#ifdef? #其他? #Endif#如果已定义? #其他? #Endif #ifndef? #其他? #Endif #if!定义的? #其他? #endif #ifdef? #elif? #elif? #其他? #endif ================================================= =============================================================================================================================================================================================================================> .Hc预编译宏开关,Afxwin.H)在项目(Project. )中使用,以后再编译该项目时,头文件的这一部分将不会被编译,仅使用预编译的结果. 这样可以加快编译速度并节省时间. 通过编译stdafx.cpp生成预编译的头文件,并以项目名称命名. 由于预编译的头文件的后缀为“ pch”,因此编译结果文件为projectname.pch. 编译器通过头文件stdafx.h使用预编译的头文件.
stdafx.h可以在项目的编译设置中指定此头文件名. 编译器认为#include&quot之前的所有代码都是stdafx.h"指令已预先编译. 它跳过#include" stdafx. H"指令,并使用projectname.pch编译此指令之后的所有代码. 因此,所有CPP实现文件的第一条语句为: #include" stdafx.h". 另外,每个实现文件CPP包含以下语句: #ifdef _DEBUG #undef THIS_FILE静态字符THIS_FILE [] = __FILE__; #endif这表示如果生成了调试版本,则应指出当前文件的名称. __FILE__是一个宏,它由编译器分配给当前正在编译的文件名. VC默认使用预编译的标头(/ Yu). 目前尚不清楚在添加新的.h文件之后,始终会出现致命错误C1010: 在寻找预编译的头指令时遇到了意外的文件结束错误. 解决方法是在#include& stdafx.h"到包含头文件,或键入项目属性,找到“ C / C ++”文件夹,然后单击“预编译头”属性页.

将“创建/使用预编译头”属性修改为“不使用预编译头”. VC预编译功能这里我们介绍VC6预编译功能的使用. 由于预编译的复杂性,此处仅介绍一些最重要的预编译指令: / Yu,/ Yc,/ Yx,/ Fp. 有关其他详细信息,请参阅: MSDN-> Visual Studio 6.0文档-> Visual C ++ 6.0文档-> VC ++程序员指南->编译器和链接器->详细信息->创建预编译的头文件预编译的概念header: 所谓的预编译头是将项目中部分代码预编译为文件(通常以.pch扩展名),该文件称为预编译头文件. 该代码可以是任何C / C ++代码,甚至可以是内联函数,但是它必须稳定并且在项目开发期间不会经常更改. 如果修改了这些代码,则需要重新编译以生成预编译的头文件. 请注意,生成预编译的头文件非常耗时.
同时,您必须注意预编译的头文件通常很大,通常为6-7M. 请注意及时清理那些无用的预编译头文件. 也许您会问: 当前的编译器具有时间戳功能. 当编译器编译整个项目时,它将仅编译修改后的文件,而不会编译自上次以来已编译的文件. 修改后的文件. 那么为什么要预编译头文件?答案就在这里,我们知道编译器是以文件为单位进行编译的. 修改文件后,它将重新编译整个文件. 当然,此文件中包含的所有头文件(例如宏,预处理器)都必须再次重新处理. VC的预编译头文件保存了这部分信息. 为了避免每次都必须重新处理这些头文件. 根据上面的介绍,预编译的头文件的作用当然是增加便宜的速度,有了它,您不需要编译不需要经常更改的代码. 编译性能当然得到了改善. 要使用预编译的头文件,我们必须指定一个包含代码和其他我们不会经常更改的头文件的头文件,然后使用该头文件生成一个预编译的头文件(.pch文件). 每个人都知道文件StdAfx.h. 许认为这是VC提供的“系统级”,VC是编译器的头文件.

否,它可以是任何名称. 让我们检查一下由AppWizard生成的基于MFC Dialog的典型程序的预编译头文件. (因为AppWizard将为我们指定如何使用预编译的头文件,所以默认值为StdAfx.h,这是VC中的名称). 我们将发现此头文件包含以下头文件: #include<
那么我们如何指定它来生成预编译的头文件. 我们知道头文件无法编译. 因此,我们还需要一个cpp文件来生成.pch文件. 该文件的默认值为StdAfx.cpp. 该文件中只有一个代码: #include“ Stdafx.h”. 原因被认为是理所当然的,我们只希望它可以编译-也就是说,我们需要的只是它的.cpp扩展名. 我们可以使用/ Yc编译开关指定StdAfx.cpp生成一个.pch文件,并使用/ Fp编译开关指定生成的pch文件的名称. 打开项目->设置-> C / C ++对话框. 将类别指向预编译头. 在左侧的树形视图中选择整个项目. 项目选项(右下角的白色位置)可以看到/ Fp“调试/ PCH.pch”. 这是指定的.pch文件的名称. 默认通常为&lt; <项目名称> .pch. 然后,在左侧的树视图中选择StdAfx.cpp. 这时,原来的Project Option变成了Source File Option(原来的项目现在是文件了,当然,它已经改变了).
在这里我们可以看到/ Yc开关. / Yc的目的是指定此文件来创建Pch文件. / Yc之后的文件名是包含稳定代码的头文件. 项目中只有一个文件可以具有YC开关. VC根据此选项将StdAfx.cpp编译为Obj文件和PCH文件. 这样,我们设置了预编译的头文件. 换句话说,我们可以使用预编译的头函数. 以下是注意事项: 1)如果使用/ Yu,则表示使用预编译. 在每个.cpp文件的开头,我们都包含了您指定用于生成pch文件的.h文件(默认为stdafx.h). 会有问题. 如果您不包括此文件,请告诉您意外的文件结尾. 2)如果您不小心丢失了pch文件,根据以上分析,您只需要让编译器生成pch文件即可. 换句话说,重新编译stdafx.cpp(即指定/ Yc的cpp文件).
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/dianqi/article-221449-1.html
最好的办法就是干掉它
好像“一妻多夫”“光棍”也不该属于经济问题啊