在我的代码中,我有一个宏:
#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
来实现这一目标?
答案 0 :(得分:3)
你不能做你梦寐以求的事。
Preprocessing是编译器最早的阶段之一(例如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;
}
dlsym
。您甚至可以在某个(临时)文件中生成一些C代码,派生一个进程将其编译为共享对象,并dlopen
该共享对象,获取一个带dlsym
的函数指针然后调用它。另见this answer。
FWIW,Common Lisp有一个非常强大的宏系统,能够在运行时“编译”,并在“编译时”进行任意计算。实际上,SBCL可能会在运行时生成良好的机器代码....
也许您想要自定义GCC编译器本身的行为。然后,您可以考虑使用MELT(特定于域的语言来扩展GCC)。但是GCC还没有实现其预处理的定制(但主要是它的中端,正在处理像Gimple这样的内部GCC表示)
答案 1 :(得分:0)
丢失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