如何在C中检查变量是否为"const"限定符类型?

mk.*_*k.. 5 c gcc const

要检查的示例代码

#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;
}
Run Code Online (Sandbox Code Playgroud)

输出:

Variable i is not a const variable
Run Code Online (Sandbox Code Playgroud)

__builtin_constant_p()不是确定一个变量的类型是否为右侧的API const或没有?

nal*_*zok 5

您可以使用通用选择(自C11起):

#include <stdio.h> 

#define __is_constant_int(X) _Generic((&X), \
        const int *: "a const int", \
        int *:       "a non-const int")

int main(void)
{
    const int i = 1;
    printf("Variable i is %s\n", __is_constant_int(i));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

  • 该标准是有缺陷的,并没有说明`i`是否应匹配`int`或`const int`.见[N1930](http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1930.htm)进行讨论.我编辑了一个有效的版本 (5认同)
  • @MM,这个DR即将被解决,实际上,委员会的意图是拥有一个类型,好像它已经经历了"左值转换",因此限定符被删除.所以原始版本不起作用,编辑后的版本不起作用. (3认同)