C 定义指向常量字符串的常量指针

C 定义指向常量字符串的常量指针,c,coding-style,C,Coding Style,读了Ulrich Drepper的bog,发现两个条目看起来像是在欺骗 在(全局空间中的字符串)中,Ulrich声明该字符串应定义为: const char _pcre_ucp_names[] = "blabla"; 虽然已经在(函数中的字符串)中,但他认为应该声明为: static const char _pcre_ucp_names[] = "blabla"; 你能解释一下用什么名字来定义字符串更好吗 UDP: 首先,我删除了C++标签——这个问题对于C++以及C++也是有效的。所以我不

读了Ulrich Drepper的bog,发现两个条目看起来像是在欺骗

(全局空间中的字符串)中,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
意味着(如果在全局、文件级)它在这个转换单元之外不可见,或者(如果在一个范围内)它将在执行范围之间保留其值。它与数据的“常量”无关。

它是用于全局(文件)级别还是在类或函数中?静态的含义不同

对于文件级别:它取决于您想要的范围(全局或仅限于文件)。没有其他区别

对于一个班级来说:如果你不想改变它,最好是使用静电。因为const仍然可以在构造函数上重新定义,所以如果它不是静态的,它必须在类本身内部为指针分配空间。如果它是静态的,那么在每个类中不需要指针


对于一个函数:我认为它不会改变任何重要的东西。在非静态情况下,将在堆栈上分配一个指针,并在每次函数调用时初始化为指向.rodata。在另一种情况下,它更像一个全局变量,但范围有限。

这取决于您是否需要字符串对项目中的其他源文件可见,您不能将其声明为
静态。如果您只需要从定义它的文件中访问它,那么您可能需要使用
static

你提到的那篇博文谈到了一些不同的东西,不过:

#include <stdio.h>
#include <string.h>
int main(void)
{
  const char s[] = "hello"; /* Notice this variable is inside a function */
  strcpy (s, "bye");
  puts (s);
  return 0;
}
该示例编译并运行。如果hello应该是常量,那么这肯定不是您想要的。当然,你也可以通过写以下内容来解决这个问题:

const char * const hello = "hello";

您仍然有两个变量,其中您只需要一个变量--hello是一个指向字符串常量的指针,如果它是一个数组,则没有多余的指针。

虽然这确实是一个常量字符串,但它既不是指针也不是常量指针,第二个变量也不是声明

两者都定义(并初始化)一个常量字符数组

唯一的区别是,第一个可以从其他翻译单元中看到和访问(假定有正确的声明),而第二个不会

注意,在C++中,可以不把变量和常数<代码>静态< /代码>放在一个未命名的命名空间中。此外,其他翻译单位也无法访问它们

const char *abc = "..."; and <br/>
const char def[] = "..."
const char*abc=“…”;和
常量字符定义[]=“…”
问题的一部分

据我所知,唯一的区别是,在使用sizeof运算符时,数组样式定义不会降级为指针

sizeof(abc) == size of pointer type <br/>
sizeof(def) == size of string (including \0)
sizeof(abc)==指针类型的大小
sizeof(def)=字符串的大小(包括\0)
您可以将其声明为const char*x=“blablabla”;。这对我来说也是个不错的解决办法:这也是我认为正确的解决方案,但是在“FiS1”中Ulrich批评了它“首先我删除了C++标签——这个问题对于C++以及C++来说都是有效的”。你的意思是“C++无效”吗?否则,为什么要删除标签??注意,C++ C++将给出不同的答案,默认情况下,const数组将内部链接。对于函数,其意义取决于函数是否是类成员。非成员静态函数类似于文件范围的静态变量:它们仅在定义它们的文件中可见。可以调用静态成员函数,而无需引用对象(SomeClass::staticMember()与someObject.nonStaticMember())。+1表示静态。但是全局变量(“第一个”)呢?为什么const char a[]i=“..”比const char a*=”?因为
const char*a=“string”
会给您留下一个额外的、不必要的指针。每次读取该变量时,都必须遍历指针——请记住,
const char*
仍然可以指向不同的字符串
const char a[]=“string”
避免创建额外的指针,从而节省空间和时间。
sizeof(abc) == size of pointer type <br/>
sizeof(def) == size of string (including \0)