C11 _Generic c程序和Eclipse c/c ++上的错误

Bel*_*hat 2 c generics gcc

嗨我第一次使用C primer plus book学习C然后在第16章关于_Generic来自C11标准我在Eclipse c/c ++中编写了一个程序并构建它产生了8个错误和警告我不知道为什么这里是程序和错误

#include <stdio.h>
#include <math.h>
#define RAD_TO_DEG (180/(4 * atanl(1)))

// generic square root function
#define SQRT(X) _Generic((X),\
    long double: sqrtl, \
    default: sqrt, \
    float: sqrtf)(X)

// generic sine function, angle in degrees
#define SIN(X) _Generic((X),\
long double: sinl((X)/RAD_TO_DEG),\
default:     sin((X)/RAD_TO_DEG),\
float:       sinf((X)/RAD_TO_DEG)\
)

int main(void)
{
    float x = 45.0f;
    double xx = 45.0;
    long double xxx =45.0L;

    long double y = SQRT(x);
    long double yy= SQRT(xx);
    long double yyy = SQRT(xxx);
    printf("%.17Lf\n", y);   // matches float
    printf("%.17Lf\n", yy);  // matches default
    printf("%.17Lf\n", yyy); // matches long double
    int i = 45;
    yy = SQRT(i);            // matches default
    printf("%.17Lf\n", yy);
    yyy= SIN(xxx);           // matches long double
    printf("%.17Lf\n", yyy);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

错误

make all 
Building file: ../generic.c
Invoking: GCC C Compiler
gcc -std=c11 -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"generic.d" -MT"generic.d" -o "generic.o" "../generic.c"
../generic.c: In function ‘main’:
../generic.c:24:5: warning: implicit declaration of function ‘_Generic’ [-Wimplicit-function-declaration]
     long double y = SQRT(x);
     ^
../generic.c:7:5: error: expected expression before ‘long’
     long double: sqrtl, \
     ^
../generic.c:24:21: note: in expansion of macro ‘SQRT’
     long double y = SQRT(x);
                     ^
../generic.c:7:5: error: expected expression before ‘long’
     long double: sqrtl, \
     ^
../generic.c:25:21: note: in expansion of macro ‘SQRT’
     long double yy= SQRT(xx);
                     ^
../generic.c:7:5: error: expected expression before ‘long’
     long double: sqrtl, \
     ^
../generic.c:26:23: note: in expansion of macro ‘SQRT’
     long double yyy = SQRT(xxx);
                       ^
../generic.c:7:5: error: expected expression before ‘long’
     long double: sqrtl, \
     ^
../generic.c:31:10: note: in expansion of macro ‘SQRT’
     yy = SQRT(i);            // matches default
          ^
../generic.c:13:1: error: expected expression before ‘long’
 long double: sinl((X)/RAD_TO_DEG),\
 ^
../generic.c:33:10: note: in expansion of macro ‘SIN’
     yyy= SIN(xxx);           // matches long double
          ^
make: *** [generic.o] Error 1

14:47:53 Build Finished (took 66ms)
Run Code Online (Sandbox Code Playgroud)

我使用-lm链接math.h并且它产生这些错误,我不知道为什么?

sta*_*ify 7

原因:

_Generic在gcc版本之前不受支持4.9,请参阅:https://gcc.gnu.org/wiki/C11Status

解:

试试新版本的gcc.

例:

In a.c是您提供的代码:

[pengyu@GLaDOS tmp]$ gcc a.c -std=c11 -lm -Wall -pedantic
[pengyu@GLaDOS tmp]$ gcc --version | head -n 1
gcc (GCC) 4.9.1 20140903 (prerelease)
Run Code Online (Sandbox Code Playgroud)