Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 可变宏是非标准的吗?_C++_C Preprocessor_Variadic Macros - Fatal编程技术网

C++ 可变宏是非标准的吗?

C++ 可变宏是非标准的吗?,c++,c-preprocessor,variadic-macros,C++,C Preprocessor,Variadic Macros,对于debugbuild,我通常使用Clang,因为它可以更好地设置警告和错误的格式,并使跟踪和修复它们变得更容易 但最近,在添加了一个带有可变参数的宏之后,Clang告诉我以下内容(来自一个虚拟项目): 我知道,macroname(args…在各种编译器中都能很好地编译,包括Visualstudio、Sunstudio,当然还有GCC。但为了确保clang是正确的,我尝试了两种扩展变量参数的其他方法: 第一: #define stuff1(...) stuff_i(...) 第二点: #d

对于debugbuild,我通常使用Clang,因为它可以更好地设置警告和错误的格式,并使跟踪和修复它们变得更容易

但最近,在添加了一个带有可变参数的宏之后,Clang告诉我以下内容(来自一个虚拟项目):

我知道,
macroname(args…
在各种编译器中都能很好地编译,包括Visualstudio、Sunstudio,当然还有GCC。但为了确保clang是正确的,我尝试了两种扩展变量参数的其他方法:

第一:

#define stuff1(...)  stuff_i(...)
第二点:

#define stuff2(...)  stuff_i(__VA_ARGS__)
在这两天,我都收到了这条信息:

main.cpp:3:16: warning: variadic macros were introduced in C99 [-Wvariadic-macros]
。。。这让我想知道Variadic宏是否实际上是C++标准的一部分(当然我知道预处理器是独立解释的)?< /P> < P>引用:

变量参数宏在1999中引入ISO/IEC 9899:1999(C99)修订C语言标准,2011在ISO/IEC 1488∶2011(C++ 11)中修订C++语言标准。< /P>


<> p> >从C99和C++ 11开始,但在C++ 03中的GNU扩展。

< P>以示例“2”的形式,它们是C99中的标准,并且通常C++编译器的预处理器对于C和C++编译是相同的。 尽管微软VC++在其他方面顽固抵制C99法规遵从性,但它们也受到支持。因此,在这和GCC之间,很少有理由避免使用它们。即使在我使用的大多数嵌入式系统编译器上,它们也受到支持

但是,请避免使用“数字1”形式,因为它是明确特定于GCC的,并且无疑已被弃用。

标准在16.3宏替换中指出:

标识符u VA u ARGS u uu只能出现在使用 参数中的省略号符号


< C++ 11中,变量宏现在包含在标准C++中。C++11标准的第16.3节规定了可变宏,使其与C99(问题的第二种形式)的可变宏兼容

下面是C++中符合标准的变量宏定义的示例:

#define foo(x, y, ...)    bar(x, y, __VA_ARGS__)

C99和C++0x正式支持版本2。C++03不支持任何可变宏。版本1是一个特定于GCC的扩展(就像您的名字一样),当您使用GCC编译时,有
-pedantic
选项,它应该报告所使用的扩展。例如,像可变长度数组或可变宏。在GCC中,它们之所以简单包括,因为它们是C99的一部分,逻辑已经实现,所以让C++用户受益似乎是个好主意:“Matthieu M:是的,我也认为这个特性是C++的一部分,因为它已经是C99的一部分……有趣的是,gcc并没有说命名变量宏确实是GNU扩展,而是说它们不是标准的一部分:
警告:ISO C不允许命名变量宏
它符合标准,但它也有逗号错误,如果维基百科是可信的。@AlexeiAverchenko:我在gcc文档中看到,如果没有在。。。然而,今天我将一些代码移植到了clang中,我得到了
预期表达式
错误,我还没有理解它。可能是related@AlexeiAverchenkoC++20中引入了
\uuuu VA\uu OPT\uu
来解决这个问题。
#define foo(x, y, ...)    bar(x, y, __VA_ARGS__)