我想知道是否有人可以就此问题提出建议:
我有一个这样定义的 C11 类型通用宏
#define hash_table_fetch(H,K,D) ((D *) _Generic((K), \
int: hash_table_fetch_long, \
long: hash_table_fetch_long, \
char *: hash_table_fetch_str, \
const char *: hash_table_fetch_str)(H,K))
哈希表同时支持字符串和长键,宏的参数是哈希表、键和用于转换的数据类型(例程返回 void *)。我可以毫无问题地使用它……主要是。问题是 gcc 在调用宏时会生成大量代码。因此,它不能用于对其参数进行字符串化的宏中,尤其是断言。
例如,这工作正常:
if (strcmp (hash_table_fetch (hash_table, 4, char), "four")
printf ("BAD\n");
然而,这:
assert (!strcmp (hash_table_fetch (hash_table, 4, char), "four"));
结果:
tests/hash_table_tests.c:53:2: error: string length ‘5359’ is greater than the length ‘4095’ ISO C99 compilers are required to support [-Werror=overlength-strings]
assert (!strcmp (hash_table_fetch (hash_table, 4, char), "four"));
有什么解决方法吗?是不是我的宏写得不好?
最佳答案
您的宏看起来非常好,这就是应该使用 _Generic
的方式。
您可能只将此视为错误,因为您打开了 -Werror
。正如警告文本所示,此测试是为了让您的代码与 C 标准中给出的约束保持最低限度的一致性。
对于您的代码,此警告并未说明任何有关可移植性的信息。这个提示的字符串长度是由编译器自己造成的,所以对于比 gcc 具有更多资源限制的编译器来说,它很可能更简单。
关掉它。
关于c - 海湾合作委员会错误 : string length too great (C11 type-generics),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28964710/