通过宏嵌入代码

Embed code through macro

本文关键字:代码      更新时间:2023-10-16

我尝试通过使用宏来嵌入代码块,如下所示:

#define RUN_CODE_SNIPPET(c) do {
c
} while(0);

其中"c"是包含在"{ }"中的代码块

这是如何使用它

#include <stdio.h>
#define RUN_CODE_SNIPPET(c) do {
c
} while(0);
int main(int argc, char *argv[]) {
RUN_CODE_SNIPPET({
//const char *message   = "World";  
const char  message[] = {'w', 'o', 'r', 'l', 'd', ''};  
printf("%srn", message);
});
return 0;
}

你可以在这里运行它

这里但是当我使用初始值设定项列表格式时出现编译器错误

test.c: In function ‘main’:
test.c:13:4: error: macro "RUN_CODE_SNIPPET" passed 6 arguments, but takes just 1
});
^
test.c:9:3: error: ‘RUN_CODE_SNIPPET’ undeclared (first use in this function)
RUN_CODE_SNIPPET({   
^~~~~~~~~~~~~~~~
test.c:9:3: note: each undeclared identifier is reported only once for each
function it appears in

编译器似乎将初始值设定项列表中的每个元素作为宏本身的参数。字符串初始值设定项工作正常。

这是怎么回事?

括号内传递的逗号被解释为宏参数分隔符,宏只需要一个参数。

有两种方法可以解决此问题:

  1. 括号中含有逗号的参数,即传递(a,b,c)而不是a,b,c(不适用于您的情况,因为您的参数不是表达式(
  2. 使用可变参数宏参数 (...->__VA_ARGS__(

换句话说:

#define RUN_CODE_SNIPPET(...) do { __VA_ARGS__; }while(0) 

将起作用(包括宏末尾的分号是不可取的 - 对于类似函数的宏,您通常应该能够执行if(X) MACRO(something); else {},分号会搞砸它(。