乌尔里希·德雷珀(Ulrich Drepper)的醉酒,看到两个看似令人困惑的参赛作品.
在第一个(全局空间中的字符串)中,Ulrich声明字符串应定义为:
const char _pcre_ucp_names[] = "blabla";
虽然已经在第二个(函数中的字符串),他认为它应该声明为:
static const char _pcre_ucp_names[] = "blabla";
你能解释什么是更好的名称来解析一个字符串?
UDP:
首先,我删除了C++标记 - 这个问题对C和C++都有效.所以我认为答案不能解释类/函数/文件范围中的静态意义是否相关.
在回答之前阅读文章.文章涉及内存使用 - 存储实际数据(在.rodata或.data部分),字符串应该重新定位(如果我们谈论unix/linux共享对象),是否可以更改字符串与否.
UDP2 在第一个中,它表示对于全局变量的形式:
(1) const char *a = "...";
不太好
(2) const char a[] = "..."
为什么?我一直认为(1)更好,因为(2)实际上复制了我们分配它的字符串,而(1)只指向我们分配的字符串.
这取决于 - 如果您需要字符串对项目中的其他源文件可见,则无法声明它static
.如果您只需要从定义它的文件中访问它,那么您可能想要使用它static
.
你提到的博客文章是在谈论不同的东西:
#include#include int main(void) { const char s[] = "hello"; /* Notice this variable is inside a function */ strcpy (s, "bye"); puts (s); return 0; }
在这种情况下,static
意味着不同的东西:这会创建一个变量,该变量在对同一函数的多次调用中持续存在.他的另一个例子显示了一个函数之外的全局变量.
编辑:
为了澄清,既然您编辑了问题,那么您不想使用的原因const char *a = "string"
是您创建了一个额外的可写指针.这意味着,虽然您无法更改字符串的字符,但您仍然可以使指针指向完全不同的字符串.见下文:
const char *hello = "hello"; int main( int argc , char const *argv[] ) { hello = "goodbye"; puts(hello); return 0; }
该示例编译并运行.如果hello应该是常量,那肯定不是你想要的.当然,你也可以写下这个来解决这个问题:
const char * const hello = "hello";
你仍然有两个变量你只需要一个 - hello是一个指向字符串常量的指针,如果它是一个数组,那么就没有那个额外的指针.