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

2023-12-01

以下代码编译良好。

#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);
    });
};

请注意,我的代码中的实际宏更复杂,我给出了一个简化版本,这可能没有多大逻辑意义

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

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

如何解决问题(我需要将额外的模板参数添加到现有代码中,并且收到这样的错误)。


你有没有尝试过:(operate_on<int, false>(book, c));? (请注意表达式周围的额外括号)。

我相信预处理器对 C++ 模板一无所知,因此会对待< and >就像任何旧令牌一样。如果没有额外的括号,它会处理operate_on<int作为一个论点,并且false>(book, c)作为另一个。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++宏问题(逗号,的解释) 的相关文章

随机推荐