【问题标题】:Conditional C preprocessor directives条件 C 预处理器指令
【发布时间】:2013-07-31 07:42:22
【问题描述】:

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

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

【问题讨论】:

  • 您究竟想在编译时和运行时实现什么?你的问题不是很清楚,让我觉得你不太了解其中的区别。
  • 请注意,var 仅在运行时具有值。对于编译器,它只是某个包含int 的静态位置的名称。在编译期间,var没有任何价值,它只有在运行时才有价值!
  • @BasileStarynkevitch,我明白了,我更新了这个问题,我希望它现在更有意义。我希望预处理器用代码中的某些条件替换 TPS,这些条件可以覆盖整个 #if #endif
  • 我相信你不太了解 C 编译器(及其预处理)是如何工作的。
  • 为什么要问你?你有什么真正的代码?请详细说明您想要实现什么,以及在编译时和运行时应该发生什么。

标签: c macros c-preprocessor


【解决方案1】:

你不能做你梦想的事情。

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

顺便说一句,也许您想在运行时动态加载一些代码?在 Linux 和大多数 Posix 系统上,您可以调用 dlopen(3)dlsym。您甚至可以在某个(临时)文件中生成一些 C 代码,派生一个进程以将其编译为共享对象,然后 dlopen 共享对象,使用 dlsym 获取函数指针,然后调用它......另见@ 987654323@.

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


附录

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

【讨论】:

  • 好的..我想我应该改写一下,我正在寻找类似条件的东西:#define TPS do{some condition that checks the value & enables my macro}while(0)
  • @tarun27sh 您在寻找#if#ifdef#else#endif 等预处理指令吗?
  • 任何东西,如果它可以检查我的变量然后是TRUEFALSE
【解决方案2】:

丢失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

【讨论】:

  • 不,我希望值 #define TPS 依赖于变量 var
  • @tarun27sh 正如其他答案中所说,由于预处理器的性质,这是不可能的。预处理器在 compile 时运行,你想在 runtime 做一些事情。为此使用普通的if
猜你喜欢
  • 1970-01-01
  • 2020-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多