#define a printf("I am int type !!~\n");
#define b printf("I am double type !!~\n");
#define foo(x) _Generic(x, int : a, \
double : b)(x)
int main(){
foo(123); // foo_int(123) // I am int type !!~
system("pause");
return 0;
}
Why does this give an error?and The compiler tells me: Should type ")"
When I change the function call in _Generic to one that is not defined by define, the compiler does not throw an error.
CodePudding user response:
Whether the functions in _generic can use macro functions defined by define?
The identifiers inside _Generic
will be expanded before _Generic
takes place. In that sense, you can use macros.
Why does this give an error?
foo(123);
expands to
_Generic(123, int : printf("I am int type !!~\n");, double : printf("I am double type !!~\n");)(123);
The ;
before ,
inside _Generic
are just invalid, and the (x)
after _Generic(...)(123)
also doesn't make sense. The produced code is not following the syntax of C programming language.
CodePudding user response:
The operands of the _Generic
cases must be expressions (specifically an assignment-expression). printf("I am int type !!~\n");
is a statement, not an expression.
When you remove the semicolon, it is an expression. Then _Generic(x, int : a, double : b)
would be fine, but you have (x)
after it. Why?
After processing of the _Generic
, the expression is basically printf("I am int type !!~\n")
. That is a complete function call. Putting (x)
after it to make printf("I am int type !!~\n")(x)
attempts to make another function call, but that does not work since printf
returns an int
, not a pointer to a function. Remove (x)
.