如何用VLA语法声明带const指针的C语言函数
如何用VLA语法声明指向char的const非空指针(等价于
char *const) 先明确几个核心等价关系,帮你理清语法逻辑:
void foo(char bar[static 1]);退化后等价于void foo(char *bar);,其中static 1会提示编译器该指针不可为NULL,部分编译器会对传入空指针的行为发出警告。void foo(const char bar[static 1]);退化后等价于void foo(const char *bar);——这里的const修饰的是指针指向的字符,而非指针本身。
你想要实现的等价于void foo(char *const bar);(指针本身为const,不能修改指针指向,但指向的字符可修改,同时要求指针非空),但无法通过数组/VLA参数语法直接实现。原因是:函数参数中的数组声明,所有const限定符都会被应用到数组元素上(即指针指向的对象),而非退化后的指针本身。
如果想要同时满足「指针本身为const」和「非空指针检查」两个需求,可以采用以下写法:
// 用编译器属性强制检查非空,同时声明指针本身为const void foo(char *const bar) __attribute__((nonnull(1)));
或者在函数内部添加C11及以上支持的静态断言:
void foo(char *const bar) { _Static_assert(bar != NULL, "bar cannot be a null pointer"); // 函数逻辑 }
另外你尝试的const char const bar[static 1]触发重复const警告,是因为const char和char const是完全等价的写法,重复添加const属于冗余语法,编译器会判定为错误。
内容的提问来源于stack exchange,提问作者CuriousTim
相关产品推荐
相关产品推荐

