繁体   English   中英

条件C预处理程序指令

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM