gpt4 book ai didi

c++ - 阅读复杂的 const 声明的简单规则?

转载 作者:IT老高 更新时间:2023-10-28 14:01:55 29 4
gpt4 key购买 nike

对于读取复杂的指针声明,有 right-left rule .

但是这条规则并没有提到如何阅读const修饰符。

例如在一个简单的指针声明中,const 可以通过多种方式应用:

char *buffer; // non-const pointer to non-const memory
const char *buffer; // non-const pointer to const memory
char const *buffer; // equivalent to previous declartion
char * const buffer = {0}; // const pointer to non-const memory
char * buffer const = {0}; // error
const char * const buffer = {0}; // const pointer to const memory

现在 const 与指针声明的指针一起使用怎么样?

char **x; // no const;
const char **x;
char * const *x;
char * * const x;
const char * const * x;
const char * * const x;
const char * const * const x;

阅读这些声明的简单规则是什么?哪些声明有意义?

Clockwise/Spiral Rule适用吗?

两个真实世界的例子

方法ASTUnit::LoadFromCommandLine使用 const char ** 提供命令行参数(在 llvm clang 源中)。

getopt() 的实参 vector 参数声明如下:

int getopt(int argc, char * const argv[], const char *optstring);

在该上下文中,char * const argv[] 等价于 char * const * argv

由于这两个函数使用相同的概念(一个指向字符串的 vector 来提供参数)并且声明不同 - 显而易见的问题是:它们为什么不同?一个比另一个更有意义?

意图应该是:const 修饰符应该指定函数不操作此 vector 的字符串,也不改变 vector 的结构。

最佳答案

const 修饰符是微不足道的:它修改它之前的内容,除非在它之前没有任何东西。所以:

char const* buffer;  // const modifies char
char* const buffer; // const modifies *

等。一般情况下,最好避免前面没有任何内容的形式const,但实际上,你会看到它们,所以你必须请记住,当 const 之前没有类型时,您必须在逻辑上将其移到第一种类型的后面。所以:

const char** buffer;

其实是:

char const** buffer;

,即指向 const char 的指针。

最后,在函数声明中,[] after 读作 * before。(同样,最好避免这种误导性的符号,但是你会看到它,所以你必须处理它。)所以:

char * const argv[],  //  As function argument

是:

char *const * argv,

指向 const 的指针,指向 char。

关于c++ - 阅读复杂的 const 声明的简单规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7526152/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com