Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to enable the _Generic keyword

Tags:

c++11

I have this test source:

#include <stdio.h>

int main()
{
    int x;

    printf("x=%d\n", _Generic('x', int: 1, default: 0));
    return 0;
}

Compiling with c++ (from GCC 4.9.2) fails:

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

The compiler arguments are:

c++ --std=c++11 t.cpp -o t

What am I doing wrong?

like image 254
Peter VARGA Avatar asked Oct 14 '25 10:10

Peter VARGA


1 Answers

_Generic is a C11 feature. It is not present in C++ (any version at least up to C++14 - I don't really expect it to be added either).

If you want to use it, you'll need to write C code, and use a compiler that supports that standard (reasonably recent versions of gcc and clang do for example, using -std=c11).

If you want to write C++, use overloading or templates instead, for example:

#include <iostream>

int foo(int)  { return 1; }
int foo(char) { return 0; }

int main()
{
  std::cout << "x=" << foo('x') << std::endl;
}

This prints x=0 in C++, the foo(char) overload is the best match.

Note that there's difference between C and C++ that might trick you here too: 'x' is a char in C++. It's an int in C. So if _Generic had been implemented (maybe as an extension) by your compiler, chances are you'd get different output when compiling your example as C versus compiling as C++.

like image 75
Mat Avatar answered Oct 17 '25 03:10

Mat