【发布时间】:2021-01-08 19:53:54
【问题描述】:
Generic o(X) 用于从多种类型构造 Object。但 GCC 不会扩展到 typedef 类型。
warning: passing argument 1 of ‘oBytes’ from incompatible pointer type [-Wincompatible-pointer-types]
68 | Object ovi = o(vi);
| ^~
| |
| HashTable {aka struct _HashTable *}
../cedata.h:13:43: note: in definition of macro ‘o’
13 | char : oBytes( X , 1), \
|
o(x)的_Generic定义:
#define o( X ) _Generic ((X), \
char : oBytes( X , 1), \
char * : oNewFrom(STRING, X), \
unsigned char * : oNewFrom(STRING, X), \
int : oNewFrom(INT, X), \
float : oNewFrom(FLOAT, X), \
short : oNewFrom(SHORT, X), \
HashTable : oNewFrom(HASHTABLE,X), \
List : oNewFrom(LIST, X), \
default : oNew() \
)
所有 oNewFrom 和 oBytes 都返回 Object。
当vi 哪个类型是HashTable 又名struct _HashTable * 与此泛型一起使用时,在Object ovi = o(vi); 行gcc 调用char : oBytes( X , 1), 而不是HashTable : oNewFrom(HASHTABLE,X),。
我犯了任何错误或泛型不适用于结构和类型定义?
【问题讨论】:
-
IIRC,通用选择器中的每个表达式都必须有效并检查错误/警告。
-
我想
STRING等。人。是类型的枚举。由于_Generic的限制[正如其他人提到的那样],为什么不对所有类型使用相同的代码? (例如)type : oAny(STRING,&X), int : oAny(INT,&X), ...和oAny是:void *oAny(int type,void *src)它可以在type上执行switch并调用正确的函数(例如oBytes、ONewFrom等)。 -
Removing oBytes HashTable 现在扩展为 oNewFrom(HASHTABLE,X) 我重新考虑我的构造函数并发现 char 是不必要的。