gcc error: string length too great (C11 type-generics)

gcc error: string length too great (C11 type-generics)

不知是否有人可以就此问题提出建议:

我有一个这样定义的 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))

散列 table 支持字符串和长键,宏的参数是散列 table、键和用于转换的数据类型(例程 return 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 更多的编译器来说,它很可能会更简单一些。

关掉它。