与宏观的Typecheck

时间:2018-05-20 10:15:24

标签: c types macros c11

我找到了这段代码并且我理解它的作用(如果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))

1 个答案:

答案 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无用的恕我直言。