C++ C++;宏问题(逗号的解释)

C++ C++;宏问题(逗号的解释),c++,syntax,macros,C++,Syntax,Macros,下面的代码编译得很好 #define CMD_MACRO(pp, cmd) \ { \ if (pp)\ { cmd; } \ } template<class T> void operate_on(T &data, char c) { data=data+1; }; int main() { int book=4; char c; CMD_MACRO(book, { oper

下面的代码编译得很好

#define CMD_MACRO(pp, cmd)  \
{           \
      if (pp)\
      { cmd; }        \
}

template<class T> void operate_on(T &data, char c) {
  data=data+1;
};

int main() {
  int book=4;
  char c;
    CMD_MACRO(book, {
        operate_on<int>(book, c);
    });
};
#定义CMD#u宏(pp,CMD)\
{           \
如果(pp)\
{cmd;}\
}
模板无效操作(T&data,字符c){
数据=数据+1;
};
int main(){
int book=4;
字符c;
CMD_宏(手册{
操作(书本,c);
});
};
请注意,我的代码中实际的宏更复杂,我给出了一个简化的版本,可能没有太多逻辑意义

现在,如果我在函数中添加另一个模板参数,它将导致编译错误(问题在代码注释中解释):

模板无效操作(T&data,字符c){
数据=数据+1;
};
int main(){
int book=4;
字符c;
CMD_宏(手册{
操作(book,c);/*这里的“,”介于int和
false正在接受治疗
作为CMD_宏的分隔参数,
而不是“cmd”的一部分。这很奇怪
因为分隔book和c的逗号是
作为“cmd”的一部分进行罚款处理*/
});
};
test.cpp:18:6:error:macro“CMD_macro”传递了3个参数,但只接受2个
test.cpp:在函数“int main()”中:
test.cpp:16:错误:“CMD_宏”未在此范围内声明
如何解决这个问题(我需要将那个额外的模板参数添加到现有代码中,我遇到了这样的错误)。

您是否尝试过:
(operation on(book,c))?(请注意表达式周围的附加括号)


我相信预处理器对C++模板一无所知,因此将<代码> <代码>代码> <代码>作为任何旧的令牌。如果没有额外的括号,它将

操作(book,c)
视为另一个。

对。预处理器知道
()
,但不知道
[]
{}
。没错,在解析方面,预处理器远不如语言聪明。我经常不得不在宏参数中添加额外的括号。太好了。。它起作用了。。我甚至不知道额外的“(“around code”充当“{”并且是有效的语法。没问题,我很高兴能帮上忙。但是
实际上并不充当
{
。前者在表达式中起作用(在本例中是这样),而后者则包装一个或多个语句。(注意我的答案中
在分号之前。)例如,您无法定义这样的函数:`int func()(return 5;)`。哦,好吧..有点明白了..:)…但仍然有点困惑,因为我在宏调用中放置了两个operate_on语句,并将它们包装在(这是可行的……我想我对表达式和宏参数的定义有点生疏了,但不太难,今天我学到了一个新东西:)一个新问题有一些很好的答案:
template<class T, bool b> void operate_on(T &data, char c) {
  data=data+1;
};
int main() {
      int book=4;
      char c;
        CMD_MACRO(book, {
            operate_on<int, false>(book, c); /* here the "," between int and 
                  false is being treated 
                  as separating arguments to CMD_MACRO, 
                  instead being part of 'cmd'. Thats strange 
                  because the comma separating book and c is 
                  treated fine as part of 'cmd'. */
        });
};


test.cpp:18:6: error: macro "CMD_MACRO" passed 3 arguments, but takes just 2
test.cpp: In function 'int main()':
test.cpp:16: error: 'CMD_MACRO' was not declared in this scope