为什么"extern const int n;"不能按预期工作?
Why does "extern const int n;" not work as expected?
我的项目只包含两个源文件:
答.cpp:
const int n = 8;
b.cpp:
extern const int n;
int main()
{
// error LNK2001: unresolved external symbol "int const n" (?n@@3HB)
int m = n;
}
我知道有几种方法可以使其工作;但是,我只是想知道为什么它不起作用?
这是因为默认情况下const
意味着内部链接,所以您的"定义"在翻译单元之外不可见它出现的地方。
在这种情况下,到目前为止,最好的解决方案是将声明( extern int const n;
( 在头文件中,并将其包含在a.cpp
和b.cpp
. 联动由编译器看到的第一个声明,因此后面的定义 a.cpp
将具有正确的(外部(链接。
或者,您可以在定义中强制链接:
extern int const n = 8;
尽管有extern
,这仍然是一个定义;任何有类定义之外的初始值设定项是一个定义。
C++中的const
和constexpr
变量具有内部链接(因此在其他编译单元中无法访问(,如果它们没有extern
声明(无论是在定义中还是在以前的声明中(。
在 C 语言中,情况并非如此(C 没有constexpr
(,所以你的代码是有效的,你可以把更多的代码放在定义上extern
。
因此,如果你想编写既是C又是C++的代码(这两个声明可能应该来自詹姆斯指出的同一个标头(:
// a.cpp
extern const int n;
const int n = 8;
// b.cpp
extern const int n;
int main()
{
int m = n;
}
如果你不这样做
// a.cpp
extern const int n = 8;
也是可能的
在 a 中声明它 extern.cpp并在 b.cpp 中不使用 extern:
A.H
extern const int n ;
答.cpp
#include "a.h"
...
const int n= 8
b.cpp:
#include "a.h"
...
int main()
{
int m = n;
}
To share a const object among multiple files, you must define the variable as extern.
To define a single instance of a const variable, we use the keyword extern on both its definition and declaration(s):
根据这些规则,您只需要在定义中添加 extern
关键字。 你已经在声明中拥有它。
如果这里的其他答案不起作用,则可能是您的定义在不同的命名空间中......如果编译通过,并且您收到undefined symbol
链接器错误:
- 检查未定义符号的命名空间;这是
extern const int n
声明的有效命名空间。 - 确保这是您在其中进行
const int n = 8
定义的有效命名空间。
- C++从其他 constexpr 创建 lambda 不能按顺序执行 Constexpr
- 为什么 HeapFree() 不能正常工作?
- std::chrono::d uration 可以按秒初始化,但不能按毫秒初始化?
- 为什么"std::is_function_v"不能按预期工作?
- C++自定义删除运算符不能正常工作?
- 我怎么不能按课程代码的降序对数字进行排序
- 为什么使用 exec() 重新启动程序不能正常工作?
- C++:返回本地对象,但不能正常工作
- 为什么带lcov的codecov在Travis上不能正常工作,而在我当地的Linux Mint上却不能正常工作
- 为什么sizeof函数在这里不能正常工作
- 为什么将可执行文件重命名为临时文件的此代码段不能按预期工作?
- c++类函数在另一个函数中不能按预期工作
- 为什么这个简单的批处理方法不能按预期工作?
- 为什么 std::is_copy_constructible 不能按预期工作
- 为什么 std::codecvt<wchar_t、char、mbstate_t> 不能按定义工作?
- 为什么我的内联汇编程序不能按预期工作
- 这个模板"specialization"代码在做什么,为什么它可以编译但不能按预期工作?
- 为什么类型推导不能按预期工作
- 为什么"extern const int n;"不能按预期工作?
- 在c++中对整数数组进行线性搜索时,SSE比较不能按预期工作