C++ 宏的参数能否传递给char数组的变量?
下面的代码有编译错误:预处理器命令必须作为第一个非空格启动C++ 宏的参数能否传递给char数组的变量?,c++,macros,C++,Macros,下面的代码有编译错误:预处理器命令必须作为第一个非空格启动 #define Assert(expr, format, ...) \ if(!(!!(expr))) \ { \ char message[4096]
#define Assert(expr, format, ...) \
if(!(!!(expr))) \
{ \
char message[4096] = #format; \
}
请帮帮我。我想将字符串传递到“format”中。以我的钱来说,这段代码前面有错误,或者反斜杠后面有空格,或者还有其他一些不明显的问题。在浏览器中选择宏时,第三个反斜杠后有三个空格。它们正式终止Assert宏,并将保留在下一行以触发错误。在宏定义之外,符号除了启动预处理器指令之外,在C++中没有意义。 我在每一行的末尾加了一根管子
#define Assert(expr, format, ...) \|
if(!(!!(expr))) \|
{ \ |
char message[4096] = #format; \|
}|
去掉这些空白,看着错误消失。代码中不允许尾随空格
当我将从问题中复制的代码放入文件pp71.cpp并尝试将其编译为空的对象文件时,我得到:
$ g++ -O3 -g -std=c++11 -Wall -Wextra -Werror -c pp71.cpp
pp71.cpp:3:65: error: backslash and newline separated by space [-Werror]
3 | { \
|
cc1plus: all warnings being treated as errors
$
这是运行macOS Catalina 10.15.3的MacBook Pro上的GCC 9.2.0版本。您可能需要在问题中添加一个示例,说明如何使用此功能。请添加一个示例调用来断言。还有,你可以用!expr代替!!!这是真的。编译错误是由空格引起的。通过删除这些空格,我成功地编译了。非常感谢您的详细解释。@wangsy Pro提示:您可以将大多数编辑器配置为在保存文件时自动删除尾随空格。