条件C预处理程序指令

时间:2013-07-31 07:42:23

标签: c macros c-preprocessor

在我的代码中,我有一个宏:

#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来实现这一目标?

2 个答案:

答案 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;
}

BTW,也许你想在运行时动态加载一些代码?在Linux和大多数Posix系统上,您可以拨打dlopen(3)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

更多信息:http://en.wikipedia.org/wiki/C_preprocessor