为什么不需要装饰一个;常量字符*”;加上;“外部”;在跨多个文件共享时 阅读C++书籍时,我了解到,共享一个变量/对象跨多个文件,我们需要在一个文件中定义const变量,并在每个源文件中声明它。比如说,

为什么不需要装饰一个;常量字符*”;加上;“外部”;在跨多个文件共享时 阅读C++书籍时,我了解到,共享一个变量/对象跨多个文件,我们需要在一个文件中定义const变量,并在每个源文件中声明它。比如说,,c++,constants,C++,Constants,在file1.cpp中,我们全局定义了一个常量int变量,如 extern const int ca = 100; const char *cstr = "hello"; 在使用它的file2.cpp中,我们声明这个变量如下 extern const int ca; extern const char *cstr; 上述惯例对我来说非常有意义。然而,当使用constchar指针时,我们不需要使用extern来定义它,而且它可以很好地跨多个文件共享。为什么会发生这样的事情?比如说, 在fi

在file1.cpp中,我们全局定义了一个常量int变量,如

extern const int ca = 100;
const char *cstr = "hello";
在使用它的file2.cpp中,我们声明这个变量如下

extern const int ca;
extern const char *cstr;
上述惯例对我来说非常有意义。然而,当使用constchar指针时,我们不需要使用extern来定义它,而且它可以很好地跨多个文件共享。为什么会发生这样的事情?比如说,

在file1.cpp中,我们全局定义了一个const char指针变量,如

extern const int ca = 100;
const char *cstr = "hello";
在使用它的file2.cpp中,我们声明这个变量如下

extern const int ca;
extern const char *cstr;
为了使我的问题更具体,为什么cstr可以在file2.cpp中使用,即使它在file1.cpp中没有用“extern”修饰


非常感谢

extern用于明确声明“extern const char*cstr;”是一个声明而不是一个定义,cstr是在其他地方定义的。如果您使用了“const char*cstr;”,编译器会将其解释为一个定义,最终会得到两个cstr变量

如果在“const char*cstr=“hello”;“上应用extern,我想编译器会忽略它,因为初始化意味着您实际上正在定义变量


更多信息:

问题在于链接。当您在以下位置定义变量时: 命名空间作用域,并且以前没有声明 建立链接,如果对象不是外部链接,则链接为外部链接 常量,如果是,则为内部。所以当你写作时:

int const ca = 100;
char const* cstr = "hello";
在源文件中,链接将是内部的,实体 (变量)
ca
引用的将是该翻译唯一的 单元如果你写过:

int ca = 100;
这种联系是外部的,因此

extern int ca;
在另一种翻译中,单位将引用相同的变量

当然,当你写作时:

int const ca = 100;
char const* cstr = "hello";
您正在定义一个指针,它不是常量(尽管 指向常量)

当然,通常情况下,您会在标题中声明变量, 使用
extern
,因此当您 定义变量,这是第一个声明
建立链接。

我认为“外部”在使用时没有任何效果,例如
extern const int ca=100,ca实际上在那里初始化。通常,“extern”告诉编译器在某个地方定义了一个这种类型和名称的变量;当我链接检查它时。但是当然,
extern char const*cstr=“abc”是一个定义
extern
在某个东西是定义还是仅仅是声明中起作用,但它只是一个元素。任何带有初始化的变量都是一个定义(至少在名称空间范围内——静态数据成员仍然是声明,即使它们有一个初始值设定项)。作者不知道C或C++。他似乎不知道许多其他语言都有外部变量的概念。