c - 海湾合作委员会错误 : string length too great (C11 type-generics)

标签 c generics gcc c11

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

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

相关文章:

连接不断失败,C 语言中出现错误 10049

c - 为什么将 void 指针递增 1 会向前移动一个字节,但整数指针是 4 个字节, double 指针是 8 个字节?

c# - 具有一个泛型类型参数的 Tuple 有什么用?

Java 泛型 - 命名实际类型的实际类型

c++ - 如何强制Bazel使用gcc?

将一个浮点变量与其包含的值进行比较

java - eclipse 编译器或 javac ("type parameters of T cannot be determined"中的错误)

c - 即使设置 PATH 变量后也是 "gcc is not recognized"。剩下什么?

c - 使用自定义目录和库的 makefile

c - 为什么 sem_wait 在 mac OSX 上不等待信号量?