__builtin_types_compatible_p能否区分char*与const char*?实测存疑
关于__builtin_types_compatible_p区分char与const char的问题
关键:顶层限定符和底层限定符的区别
GCC文档里提到的“忽略顶层限定符”,特指直接限定变量本身的const/volatile修饰符:
- 比如
int和const int,这里的const是顶层限定符,作用于整个int变量,所以__builtin_types_compatible_p会判定两者类型兼容。 - 但
char*和const char*的情况不一样:这里的const是底层限定符,它修饰的是指针指向的char类型,而非指针本身。简单说,const char*是“指向const字符的指针”,char*是“指向字符的指针”,这是两种不同的指针类型,不属于顶层限定符的范畴,因此__builtin_types_compatible_p会正确区分它们。
你的测试结果符合规则
你给出的测试代码结果完全符合上述逻辑:
char * myArray = "I love you."; const char * myConstArray = "I love const."; printf("is myArray char * ? %d.\n",__builtin_types_compatible_p(__typeof__(myArray), char *)); // 输出1 printf("is myArray const char * ? %d.\n",__builtin_types_compatible_p(__typeof__(myArray), const char *)); // 输出0 printf("is myConstArray char * ? %d.\n",__builtin_types_compatible_p(__typeof__(myConstArray), char *)); // 输出0 printf("is myConstArray const char * ? %d.\n",__builtin_types_compatible_p(__typeof__(myConstArray), const char *)); // 输出1
在GCC 9和11.4.0环境下的输出一致,是因为这两种指针类型本身就不兼容,和顶层限定符无关。
再举个顶层限定符的例子
如果是指针自身带const(顶层const),比如char* const(指向char的常量指针),这时候__builtin_types_compatible_p会忽略这个顶层const,判定它和char*类型兼容:
char* const ptr = "test"; printf("%d\n", __builtin_types_compatible_p(__typeof__(ptr), char*)); // 输出1
内容的提问来源于stack exchange,提问作者pasu
相关产品推荐
相关产品推荐

