我有这个测试来源:
#include <stdio.h>
int main()
{
int x;
printf("x=%d\n", _Generic('x', int: 1, default: 0));
return 0;
}
使用c ++(来自GCC 4.9.2)进行编译失败:
t.cpp: In function ‘int main()’:
t.cpp:7:33: error: expected primary-expression before ‘int’
printf("x=%d\n", _Generic('x', int: 1, default: 0));
^
t.cpp:7:41: error: expected primary-expression before ‘default’
printf("x=%d\n", _Generic('x', int: 1, default: 0));
^
t.cpp:7:51: error: ‘_Generic’ was not declared in this scope
printf("x=%d\n", _Generic('x', int: 1, default: 0));
编译器参数是:
c++ --std=c++11 t.cpp -o t
我做错了什么?
答案 0 :(得分:2)
_Generic
是C11功能。它不存在于C ++中(任何版本至少高达C ++ 14 - 我真的不希望它被添加)。
如果你想使用它,你需要编写C代码,并使用支持该标准的编译器(例如,使用-std=c11
的gcc和clang的合理最新版本)。
如果您想编写C ++,请使用重载或模板,例如:
#include <iostream>
int foo(int) { return 1; }
int foo(char) { return 0; }
int main()
{
std::cout << "x=" << foo('x') << std::endl;
}
这会在C ++中打印x=0
,foo(char)
重载是最佳匹配。
请注意,C和C ++之间的区别也可能会欺骗您:'x'
是C ++中的char。它是C中的int
。因此,如果编译器已经实现了_Generic
(可能作为扩展),那么在将您的示例编译为C而不是编译为C ++时,可能会获得不同的输出。 / p>
答案 1 :(得分:0)
这里是C ++表单(原谅我使用using指令,我知道它的错误形式):
#include <iostream>
using namespace std;
template< typename T> T do_something(T argument) {
// Put here what you need
}
int main()
{
int x;
cout << "x" << (x = do_something(x));
return 0;
}
_Generic是C11,当您打算使用C编译器时,您可能正在使用C ++编译器。