g ++ 4.8.5:未使用##]提供有效的预处理令牌>

问题描述 投票:0回答:2

当我尝试在Linux中使用G ++ 4.8编译程序时,出现“未提供有效的预处理令牌”错误。并且当我使用CCSuntudio在Solaris中编译它时,我没有错误。

在我的代码下面:

#include <iostream>

#define func(type1,varname1) \
        cout << "ma var est "<<##varname1<<" et le type est "<<#type1; \
        cout <<endl;

using namespace std;

int main() {
  func("int", "area");
}

它在CCSunStudio中完美运行,但不适用于G ++

hello.hxx:2:23: error: pasting "<<" and ""area"" does not give a valid preprocessing token
  cout << "ma var est "<<##varname1<<" et le type est "<<#type1; \
                       ^
hello.cxx:7:1: note: in expansion of macro ‘func’
 func("int","area");
 ^

感谢您的帮助

当我尝试在Linux中使用G ++ 4.8编译程序时,出现“未提供有效的预处理令牌”错误。并且在Solaris中使用CCSuntudio进行编译时没有错误。在我的下面...

c++ g++ c-preprocessor preprocessor
2个回答
1
投票

在这种情况下,g ++是正确的。 <<##varname1的语义是<<varname1的扩展值粘贴到一个令牌中,即,<<"area"被编译器视为单个令牌,并且由于这不是有效的令牌,因此会报告错误。


0
投票

[不需要在每次在宏中使用参数时都使用##

© www.soinside.com 2019 - 2024. All rights reserved.