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
继续。