#define declareRunTimeSelectionTable\
(autoPtr,baseType,argNames,argList,parList) \
\
/* Construct from argList function pointer type */ \
typedef autoPtr< baseType > (*argNames##ConstructorPtr)argList;
argList是宏参数,经过typedef是不是变成传出的参数了?
(autoPtr,baseType,argNames,argList,parList) \
\
/* Construct from argList function pointer type */ \
typedef autoPtr< baseType > (*argNames##ConstructorPtr)argList;
argList是宏参数,经过typedef是不是变成传出的参数了?
解决方案
40
1)宏可以带参数
2)你理解错了,##是符号连接运算符,一般只用在预处理语句的宏定义中。
argNames##ConstructorPtr 把符号argNames和ConstructorPtr 连接成为一个 符号
例如 宏参数argNames 在一次宏调用中被替换为 A ;
argNames##ConstructorPtr 就是AConstructorPtr
假如ConstructorPtr也是宏参数,替换参数为B那么argNames##ConstructorPtr 就是 AB
之所以使用##,是原因是宏只能替换完整的ID,不能替换部分ID,##就是用来解决这个问题的。
例如typedef autoPtr< baseType > (*argNames##ConstructorPtr)argList;
改成typedef autoPtr< baseType > (*argNamesConstructorPtr)argList;
那么argNamesConstructorPtr不会被替换成AConstructorPtr
typedef autoPtr< baseType > (*argNamesConstructorPtr)argList;
依然是typedef autoPtr< baseType > (*argNamesConstructorPtr)argList;
这不是你想要的
PS:
## 一般只会用在 预编译语句#define中;
#,## 是两个预编译语句特有的运算符。
#把符号字符串化
##;连接两个符号,拼成一个新的符号。
这两个符号,比较不常用,他们不是语言的成分,只是预编译语句的符号。
假如,C,C++书中没有讲他们,,那是正常的。
讲了,反而未必是好书。
2)你理解错了,##是符号连接运算符,一般只用在预处理语句的宏定义中。
argNames##ConstructorPtr 把符号argNames和ConstructorPtr 连接成为一个 符号
例如 宏参数argNames 在一次宏调用中被替换为 A ;
argNames##ConstructorPtr 就是AConstructorPtr
假如ConstructorPtr也是宏参数,替换参数为B那么argNames##ConstructorPtr 就是 AB
之所以使用##,是原因是宏只能替换完整的ID,不能替换部分ID,##就是用来解决这个问题的。
例如typedef autoPtr< baseType > (*argNames##ConstructorPtr)argList;
改成typedef autoPtr< baseType > (*argNamesConstructorPtr)argList;
那么argNamesConstructorPtr不会被替换成AConstructorPtr
typedef autoPtr< baseType > (*argNamesConstructorPtr)argList;
依然是typedef autoPtr< baseType > (*argNamesConstructorPtr)argList;
这不是你想要的
PS:
## 一般只会用在 预编译语句#define中;
#,## 是两个预编译语句特有的运算符。
#把符号字符串化
##;连接两个符号,拼成一个新的符号。
这两个符号,比较不常用,他们不是语言的成分,只是预编译语句的符号。
假如,C,C++书中没有讲他们,,那是正常的。
讲了,反而未必是好书。