通过宏嵌入代码
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
编译器似乎将初始值设定项列表中的每个元素作为宏本身的参数。字符串初始值设定项工作正常。
这是怎么回事?
括号内传递的逗号被解释为宏参数分隔符,宏只需要一个参数。
有两种方法可以解决此问题:
- 括号中含有逗号的参数,即传递
(a,b,c)
而不是a,b,c
(不适用于您的情况,因为您的参数不是表达式( - 使用可变参数宏参数 (
...
->__VA_ARGS__
(
换句话说:
#define RUN_CODE_SNIPPET(...) do { __VA_ARGS__; }while(0)
将起作用(包括宏末尾的分号是不可取的 - 对于类似函数的宏,您通常应该能够执行if(X) MACRO(something); else {}
,分号会搞砸它(。
相关文章:
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 代码在main()中运行,但在函数中出现错误
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 编译包含字符串的代码时遇到问题
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 在Linux for Windows上编译C++代码时出错
- 我的字符计数代码计算错误.为什么
- 孤立代码块在结构中引发异常
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 此代码是否违反一个定义规则
- 为什么我的代码在输出中增加了93天
- 我的简单if-else语句是如何无法访问的代码
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 为什么在这个代码结束循环中没有得到结束
- 在c代码之间共享数据的最佳方式
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值