Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.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+中#define的不同语法+;包括很多声明_C++_C_Macros_C Preprocessor - Fatal编程技术网

C++ C/C+中#define的不同语法+;包括很多声明

C++ C/C+中#define的不同语法+;包括很多声明,c++,c,macros,c-preprocessor,C++,C,Macros,C Preprocessor,我理解#define的语法,比如 #define Pi 3.14 所以很明显,我们可以在代码中的任何地方使用Pi常量,而不是3.14,以提高代码的可读性 但我遇到了如下语法 这是否意味着每当我调用宏时 doIT("hello world"); 将调用{…}中的代码语句吗 \define是否允许给出这样的语法。? \uuuu函数,\uuu VA\u ARGS\uuuu是什么意思 #define doIT(str, ...)

我理解
#define
的语法,比如

#define Pi 3.14
所以很明显,我们可以在代码中的任何地方使用
Pi
常量,而不是
3.14
,以提高代码的可读性

但我遇到了如下语法

这是否意味着每当我调用宏时

doIT("hello world");
将调用{…}中的代码语句吗

\define
是否允许给出这样的语法。?
\uuuu函数
\uuu VA\u ARGS\uuuu
是什么意思

#define doIT(str, ...)                                                                      \
{                                                                                               \
    if (pDoLog) pDoLog->LogMsg("[%s] Error: " str, LOG_WRONG, __FUNCTION__, ##__VA_ARGS__); \
    printf("[%s] Error: " str "\n", __FUNCTION__, ##__VA_ARGS__);                               \
}
您不会“调用”宏,它的扩展也不会被“调用”。在编译代码之前,预处理器只是用宏的扩展替换宏

用括号定义的宏,如
doIt(str)
,是一个“类似函数的宏”,这意味着它接受可用于宏扩展的参数

参数列表中带有
的类似宏的函数表示它可以接受可变数量的参数。特殊预定义符号
\uu VA\u ARGS\uu
扩展到传递给
..
占位符的参数列表

\uuuu FUNCTION\uuuu
是一个特殊的预定义符号,可扩展为当前正在编译的函数的名称,因此,无论宏在何处展开,它都将使用封闭函数的名称。

您不会“调用”宏,也不会“调用”宏的展开。在编译代码之前,预处理器只是用宏的扩展替换宏

用括号定义的宏,如
doIt(str)
,是一个“类似函数的宏”,这意味着它接受可用于宏扩展的参数

参数列表中带有
的类似宏的函数表示它可以接受可变数量的参数。特殊预定义符号
\uu VA\u ARGS\uu
扩展到传递给
..
占位符的参数列表


\uuuu FUNCTION\uuuu
是一个特殊的预定义符号,可扩展为当前正在编译的函数的名称,因此,无论宏在何处展开,它都将使用封闭函数的名称。

您可能需要进一步阅读,特别是类似于宏的函数。在(false)ala
#define doIT(str,…)do{if…;printf…}而(false)
-如果您编写类似于
if(whatever)doIT(“%d”,i”)的代码,则会这样;否则,
宏替换不会给您
if(…){;else…;
-请注意
}
后面和
else
前面的分号,这会导致编译错误,因为没有“open”
if语句让
else
继续。您可能想继续阅读,特别是像宏一样的函数。最好将语句块包装在
do{…}while(false)
ala
#define doIT(str,…)do{if…;printf…}while(false)
-如果您编写类似于
if(whatever)doIT(“%d”,i”)的代码,则会这样;否则,
宏替换不会给您
if(…){;else…;
-注意
}
后面和
else
前面的分号,这会导致编译错误,因为没有“open”
if
语句让
else
继续。