[英]Conditional C preprocessor directives
在我的代码中,我有一个宏:
#define TPS 1(or 0)
int main()
{
....
if(var)
{
#ifdef TPS
do something
#endif
}
}
但是现在,我想将if(var)
与宏合并,以便实现:
int var=1;
#define TPS (if(var))
int main()
{
int a, b, c;
a=1;b=2;c=3;
#if TPS
printf("a: %d\n", a);
printf("b: %d\n", b);
printf("c: %d\n", c);
#endif
printf("++a: %d\n", ++a);
return 0;
}
也就是说,只有在var=1
例如,对于var = 1),才应存在宏条件语句中的代码块:
int main()
{
int a, b, c;
a=1;b=2;c=3;
printf("a: %d\n", a);
printf("b: %d\n", b);
printf("c: %d\n", c);
printf("++a: %d\n", ++a);
return 0;
}
并且,对于var = 0:
int main()
{
int a, b, c;
a=1;b=2;c=3;
printf("++a: %d\n", ++a);
return 0;
}
如何实施#define TPS
以实现此目标?
您无法做自己梦dream以求的事情。
预处理是编译器最早的阶段之一(例如gcc
)。 TPS
看起来像您希望它具有编译行为取决于运行时变量var
。 从概念上讲,编译器首先会对您的源进行预处理。 您可以使用gcc -C -E
来获取预处理的文本形式。
在编译时,变量具有名称,编译器将找到其位置(但是在编译期间变量没有任何值)。 在运行时,变量的位置包含值。 值在编译时不存在,因此您不能在预处理阶段使用它们。
但是,预处理可以是有条件的,例如
#if WANTPRINT
printf("a: %d\n", a);
#endif
然后可以将-DWANTPRINT=1
标志传递(或不传递)给编译器。
你可以编码
int var;
int main() {
int a, b, c;
a=1;b=2;c=3;
if (var) {
printf("a: %d\n", a);
printf("b: %d\n", b);
printf("c: %d\n", c);
};
printf("++a: %d\n", ++a);
return 0;
}
顺便说一句,也许您想在运行时动态加载一些代码? 在Linux和大多数Posix系统上,可以调用dlopen(3)和dlsym
。 您甚至可以在某个(临时)文件中生成一些C代码,派生一个进程以将其编译为共享对象,然后dlopen
该共享对象,获取带有dlsym
的函数指针,然后调用它...另请参dlsym
答案 。
FWIW,Common Lisp具有非常强大的宏系统,并且能够在运行时“编译”,并能够在“编译时”进行任意计算。 实际上, SBCL在运行时可能会生成良好的机器代码。
也许您想自定义GCC编译器本身的行为。 然后,您可以考虑使用MELT (一种扩展GCC的域特定语言)。 但是,GCC尚未启用其预处理的自定义功能(但大多数是中端的,用于内部GCC表示形式,例如Gimple)
丢失var
整数:
#define TPS 1
#if TPS == 1
printf("a: %d\n", a);
printf("b: %d\n", b);
printf("c: %d\n", c);
#endif
只需检查它是否已定义即可使用#ifdef
:
#define TPS
#ifdef TPS
printf("a: %d\n", a);
printf("b: %d\n", b);
printf("c: %d\n", c);
#endif
此处更多信息: http : //en.wikipedia.org/wiki/C_preprocessor
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.