要检查的示例代码
#include<stdio.h>
int main(void)
{
const int i = 1;
printf("Variable i is %s\n",
__builtin_constant_p(i) ? "a const variable" : "not a const variable");
return 0;
}
输出量:
Variable i is not a const variable
__builtin_constant_p()
是否不是正确的API来确定变量是否为const
类型?
5条答案
按热度按时间zaqlnxep1#
您可以使用常规选择(自C11起):
3wabscal2#
RTFineManual:
你可以使用内置函数__builtin_constant_p来确定一个值在编译时是否已知是**常量 *.
(强调我的)注意这是一个gcc编译器扩展,因此不符合标准。
C语言中没有符号常量,只有 * n-constants *。
const
限定对象仍然是变量。因此,测试失败。典型应用请参见手册。备注:
假设显示的代码只是一个例子,您的问题看起来像一个XY问题。C是静态类型的,因此在你使用这样一个构造时,完整的类型是众所周知的。要想有类似功能的东西,唯一的方法就是宏。但是在宏中隐藏不同的行为会导致代码的读者混淆。她必须记住每一次调用的区别。
相反,使用两个具有不同行为的函数,并相应地命名它们。由于调用者知道类型,他可以使用正确的函数和代码的任何读者(包括几周后的你!)会立即知道差异。
zpjtge223#
对于
GCC
/LLVM
,你可以使用__builtin_types_compatible_p
,__builtin_choose_expr
和__builtin_classify_type
来做这件事,而不必为每个指针类型做一个案例。唯一的缺点是你需要显式检查所有嵌套级别(即你需要一个单独的宏为T const * const *
和T const **
,所以它将是痛苦的代码过去的双重三重嵌套)。解决方案
一般的想法是,如果
x
是一个指针类型,我们将其重建为我们想要检查的const
指针的任何程度,并使用__builtin_types_compatible
来查看我们是否重建了相同的类型或新类型。解决方案about将检查单/双嵌套指针的所有情况。不幸的是,这将需要4个额外的宏来做三倍和8后,做四倍。如果你给它传递一个三重嵌套指针,它仍然可以编译,但是它不能识别像
T const * const * const *
这样的模式,也不能识别不同于T const * const *
的模式。测试
产量:
这正是我们想要的
cigdeys34#
如何在C中检查变量是否为“const”限定符类型?
使用GCC,您可以做到:
__builtin_types_compatible_p
忽略顶级限定符,但这些是指针。__builtin_constant_p()不是判断变量是否为const类型的正确API吗?
不,
__builtin_constant_p
检查表达式的 * 值 * 在编译时是否已知,而不是const
限定的类型。bvjxkvbb5#
完全通用于新标准化的
typeof
(它已经被许多(gcc,clang,tinycc)编译器长期支持):