三、条件编译
条件编译命令#if、#else、#elif、#endif、#ifdef、#ifndef,条件编译指令的意思很简单,跟我们学习的if语句类似。
一般格式
#if 常量表达式
程序段1;
[#else
程序段2;]
#endif
功能:当表达式为非0(“逻辑真”)时,编译程序段1,否则编译程序段2。
一般格式
#ifdef 标识符
程序段1;
[#else
程序段2;]
#endif
功能:当“标识符”已经被#define命令定义过,则编译程序段1,否则编译程序段2。
#ifndef 标识符
程序段1;
[#else
程序段2;]
#endif
功能:当“标识符”未被#define命令定义过,则编译程序段1,否则编译程序段2。
学习了条件编译指令之后,我们在调试代码的时候,就不要再随心所欲的删减代码了,如果我们不想某段代码被编译就可以使用条件编译指令来将其注释掉。如:
#if (0)
注释代码段;
#endif
就可以实现代码的注释了,需要的时候也可以将其启用,而不会为需要重新编辑代码时,发现已被删除而头疼了。
其中值得注意的地方为,常量表达式在编译时求值,所以表达式只能是常量或者已经定义过的标识符,不能为变量,也不可以为那些在编译时候求值的操作符,如sizeof。
下面来看段代码:
view plain#include< P>
#define N 1
int main(int argc,char*argv)
{
int a=3;
#if(a)
printf(“#if后面的表达式为变量\n”);
#endif
#if(N)
printf(“#if后面的表达式已定义,且不为0---success\n”);
#else
printf(“#if后面的表达式已定义,且不为0---fail\n”);
#endif
return 0;
}
运行结果为:
view plain#if后面的表达式已定义,且不为0---success
Press any key to continue
看看上面的代码我们的表达式为变量a时并没有打印出来,所以我们不能在其后的表示中使用变量。如果我们使用sizeof操作符会怎么样呢?为了加深印象看看下面的代码后结果吧。
view plain#include< P>
int main(int argc,char*argv)
{
int a=9;
#if(sizeof(a))
printf(“#if后面的表达式含有sizeof操作符\n”);
#endif
return 0;
}
编译出现了如下错误:
view plainfatal error C1017: invalid integer constant expression
所以我们在使用条件编译的时候要牢记这两点,常量表达式不能为变量和含有sizeof等在编译时求值的操作符。
接下来看看这里要讲的最后一个#pragma指令。
一般格式为:
#pragma 参数
下面给出几种经常使用的形式
1、#pragma message(“消息”)
看看下面一段代码。
view plain#include< P>
#define FDSA
int main(int argc,char*argv)
{
#ifdef FDSA
#pragma message(“FDSA 已经定义过了”)
#endif
return 0;
}
编译的时候我们可以在编译输出窗口中看到了输出“FDSA 已经定义过了”,通过这种方式我们可以在一些我们想要的地方输出很多我们需要的信息。
2、#pragma once
如果我们在头文件的开头部分加入这条指令,那么就能保证我们的头文件仅仅被编译一次。
3、#pragma hdrstop
该指令表示编译头文件到此为止,后面的无需在进行编译了。
4、#pragma pack()
设定字节的对齐长度,这个指令我们在中已经讲解了,在此不再复述。< P>
5、#pragma warning(disable:M N;once:H;error:K)
表示不显示M和N号的警告信息,H号警告信息只报告一次,把K号警告信息作为一个错误来处理。
到此关于预处理的讲解就结束了。由于本人水平有限,博客中的不妥或错误之处在所难免,殷切希望读者批评指正。同时也欢迎读者共同探讨相关的内容,如果乐意交流的话请留下你宝贵的意见。 |