如何启用_Generic关键字

时间:2015-01-31 16:31:25

标签: c++11

我有这个测试来源:

#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

我做错了什么?

2 个答案:

答案 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=0foo(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 ++编译器。