我找到了这段代码并且我理解它的作用(如果var是 float 的类型则打印)但我无法理解:
#include <stdio.h>
#include <stdlib.h>
#define typename(x) _Generic((x), float: "float")
#define isCompatible(x, type) _Generic(x, type: true, default: false)
int main(){
float var;
if(isCompatible(var, float))
printf("var is of type float!\n");
}
什么是 typename(x)?为什么从未打电话? 我也无法理解这个结构:
_Generic(x, type: true, default: false)
这里有一种方法可以不将 float 作为参数传递并使其隐式吗?
if(isCompatible(var, float))
答案 0 :(得分:0)
为什么永远不会调用typename
是一个问题,你应该问代码片段的开发者......
_Generic
关键字是C11功能。
这个想法是根据变量的类型生成不同的代码。
C没有像Java这样的typeof
运算符,因此Java中的内容似乎是
...
if(typeof(p) == typeof(double)) {
System.out.println("Got type 1");
}
if(typeof(p) == typeof(char)) {
System.out.println("Got type 2");
}
...
可以通过C11中的_Generic
来实现
#include <stdio.h>
#define PRINT_MY_TYPE_NUMBER(x) _Generic((x), \
double: printf("Got type 1\n"),\
char: printf("Got type 2\n") \
)
int main(int c, char** v) {
double p = 10;
PRINT_MY_TYPE_NUMBER(p));
}
注意:_Generic
不支持任意,但只支持“简单”类型。
isCompatible(variable, type)
背后的想法是,如果true
的类型与variable
兼容,则返回type
。这取决于type
被传递,因此它依赖type
传递,使type
隐式传递使isCompatible
无用的恕我直言。