当前位置: 技术问答>linux和unix
关于#if的问题
来源: 互联网 发布时间:2016-04-08
本文导语: 我之前定义了#define TESTING 0和#define SINGLETHREAD 1 那么 #if TESTING printf( "0 frPX Rejt:%d:%*.*s:%s:%d:%d:%sn",getpid(), 1, 1, "1", "1", ilen,ilen,ibuf); #else msgLog( "0 frPX Rejt:%d:%*.*s:%s:%d:%d:%sn",getpid(), 1, 1, "...
我之前定义了#define TESTING 0和#define SINGLETHREAD 1
那么
#if TESTING
printf( "0 frPX Rejt:%d:%*.*s:%s:%d:%d:%sn",getpid(),
1, 1, "1", "1", ilen,ilen,ibuf);
#else
msgLog( "0 frPX Rejt:%d:%*.*s:%s:%d:%d:%sn",getpid(),
1, 1, "1", "1", ilen,ilen,ibuf);
#endif
是不是永远执行#else里的东西?
#ifndef SINGLETHREAD
void quitRunning(int sig)
{
msgLog("quitRunning %d",getpid());
if( gpid_recv )
kill(gpid_recv, SIGQUIT);
if( gpid_send )
kill(gpid_send, SIGQUIT);
if( gpid_send2 )
kill(gpid_send2, SIGQUIT);
}
#endif
这个里面的语句是不是永远不会执行呢?
那么
#if TESTING
printf( "0 frPX Rejt:%d:%*.*s:%s:%d:%d:%sn",getpid(),
1, 1, "1", "1", ilen,ilen,ibuf);
#else
msgLog( "0 frPX Rejt:%d:%*.*s:%s:%d:%d:%sn",getpid(),
1, 1, "1", "1", ilen,ilen,ibuf);
#endif
是不是永远执行#else里的东西?
#ifndef SINGLETHREAD
void quitRunning(int sig)
{
msgLog("quitRunning %d",getpid());
if( gpid_recv )
kill(gpid_recv, SIGQUIT);
if( gpid_send )
kill(gpid_send, SIGQUIT);
if( gpid_send2 )
kill(gpid_send2, SIGQUIT);
}
#endif
这个里面的语句是不是永远不会执行呢?
|
补充一点:
#if 是测试 后边的值
而 #ifndef #ifdef只是测试宏是否被定义,而不管你定义的宏的值是什么。
比如
#define ab 3
int main()
{
#ifdef 0 //错误的方法
printf("abn");
#endif
#if 0 //正确的
printf("abn");
#endif
#if 3 //正确的
printf("abn"); //能被编译执行
#endif
#if ab==3 //正确的
printf("abn"); //能被编译执行
#endif
#if ab!=3 //正确的
printf("abn");
#endif
#ifdef ab!=3 //错误的
printf("abn");
#endif
#ifdef ab //错误的
printf("abn");
#endif
}
~
你可以这样理解:不符合条件的代码就相当于被你注释掉了。
#if 是测试 后边的值
而 #ifndef #ifdef只是测试宏是否被定义,而不管你定义的宏的值是什么。
比如
#define ab 3
int main()
{
#ifdef 0 //错误的方法
printf("abn");
#endif
#if 0 //正确的
printf("abn");
#endif
#if 3 //正确的
printf("abn"); //能被编译执行
#endif
#if ab==3 //正确的
printf("abn"); //能被编译执行
#endif
#if ab!=3 //正确的
printf("abn");
#endif
#ifdef ab!=3 //错误的
printf("abn");
#endif
#ifdef ab //错误的
printf("abn");
#endif
}
~
你可以这样理解:不符合条件的代码就相当于被你注释掉了。
|
预编译指令,在编译后的目标文件中仅存在其中的一部分:不符合预编译条件的就不会被编译器识别。
|
不是执行,而是那些代码根本不会编译进去.
|
用gcc -E -o test.i test.c做一下预处理,看一下生成的test.i文件,就能有点概念了。
#include、#if、#define这类东西,都是由预处理器处理的。编译器看到的代码就是象test.i那样经过预处理的,#else里面的东西在编译之前已经被预处理器删掉了。
而如果用这样的
if(...)
printf( "0 frPX Rejt:%d:%*.*s:%s:%d:%d:%sn",getpid(), 1, 1, "1", "1", ilen,ilen,ibuf);
else
msgLog( "0 frPX Rejt:%d:%*.*s:%s:%d:%d:%sn",getpid(), 1, 1, "1", "1", ilen,ilen,ibuf);
这些代码都会被编译到最后的程序里,在运行时才判断应该执行哪部分。
可以看出来,这样的方案,和用#if相比,可执行文件比较大(因为编译了全部代码),而且运行时会稍慢一点(花时间做判断)
#include、#if、#define这类东西,都是由预处理器处理的。编译器看到的代码就是象test.i那样经过预处理的,#else里面的东西在编译之前已经被预处理器删掉了。
而如果用这样的
if(...)
printf( "0 frPX Rejt:%d:%*.*s:%s:%d:%d:%sn",getpid(), 1, 1, "1", "1", ilen,ilen,ibuf);
else
msgLog( "0 frPX Rejt:%d:%*.*s:%s:%d:%d:%sn",getpid(), 1, 1, "1", "1", ilen,ilen,ibuf);
这些代码都会被编译到最后的程序里,在运行时才判断应该执行哪部分。
可以看出来,这样的方案,和用#if相比,可执行文件比较大(因为编译了全部代码),而且运行时会稍慢一点(花时间做判断)