-1

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

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

4

2 回答 2

3

你不能做你梦想的事情。

预处理是编译器的最早阶段之一(例如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然后调用它......另见这个答案

FWIW,Common Lisp 有一个非常强大的宏系统,能够在运行时“编译”,并在“编译时”进行任意计算。实际上,SBCL在运行时可能会生成好的机器代码......


附加物

也许您想自定义 GCC 编译器本身的行为。然后您可能会考虑使用MELT(一种扩展 GCC 的领域特定语言)。但是 GCC 还不能定制它的预处理(但主要是它的中端,处理像 Gimple 这样的内部 GCC 表示)

于 2013-07-31T07:45:04.080 回答
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

于 2013-07-31T07:44:31.733 回答