Code Bye

宏也可以传出参数么

#define declareRunTimeSelectionTable\
(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++书中没有讲他们,,那是正常的。
讲了,反而未必是好书。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明宏也可以传出参数么