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提示:您可以将大多数编辑器配置为在保存文件时自动删除尾随空格。