静态常量字符指针及其使用方式的原因

Static constant character pointer and why it's used in this fashion

本文关键字:方式 常量 字符 指针 静态      更新时间:2023-10-16
static const char* const test_script = "test_script";

您何时以及为什么要使用上述语句?它有什么好处吗?

为什么使用char*而不是常量字符?"常量字符指针"(const char*)已经是一个常量,不能更改;那为什么要在前面使用static这个词呢?它有什么好处?

const char *p

是一个常量指针。它是一个指向const char的可修改指针,即指向常量字符的指针。可以使指针指向其他内容,但不能更改指针指向的字符。换句话说,p = x是允许的,但*p = y不是。

char * const则相反:指向可变字符的常量指针。 *p = y是允许的,p = x不是。

const char * const既是:指向常量字符的常量指针。

关于static:这给出了声明的变量内部链接(不能从源文件外部按名称访问)。由于您同时询问 C 和 C++,请注意这是它们的不同之处。

在C++中,声明为const且未显式声明extern变量默认具有内部链接。由于有问题的指针是const的(我说的是第二个const),因此static在C++中是多余的,并且不做任何事情。

在 C 语言中并非如此,const变量不能用作常量表达式,默认情况下也没有内部链接。所以在C中,static是必要的,以提供test_script内部链接。

上面对static的讨论假定声明位于文件范围 (C) 或命名空间范围 (C++)。如果它位于函数内部,则static的含义会发生变化。如果没有static,它将是函数中的普通局部变量——每个调用都有自己的副本。使用 static ,它接收静态存储持续时间,因此在函数调用之间持续存在 — 所有调用共享该副本。既然你同时问的是C和C++,我不打算讨论类范围。

最后,你问"为什么是指针而不是字符"。这样,指针指向实际的字符串文本(可能在进程内存的只读部分的某个位置)。这样做的一个原因是,如果您甚至需要将test_script传递到需要const char * const *(指向常量字符的常量指针)的某个位置。此外,如果同一字符串文本在源代码中多次出现,则可以共享它。

另一种方法是声明一个数组:

const char test_script[] = "test_script";

这会将字符串文本复制到test_script,保证它有自己的数据副本。然后,您可以在编译时从sizeof test_script(包括终止NUL)中学习长度。如果它是该字符串文本的唯一出现,它还会消耗略少的内存(不需要指针)。但是,由于它将拥有自己的数据副本,因此它无法共享字符串文本的存储(如果代码中的其他地方也使用该存储)。