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 更多的编译器来说,它很可能会更简单一些。
关掉它。
不知是否有人可以就此问题提出建议:
我有一个这样定义的 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 更多的编译器来说,它很可能会更简单一些。
关掉它。