You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

__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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 12:03:09