这是主题代码:
外部文件.cpp
int i = 10;
主文件.cpp
#include <iostream>
using namespace std;
extern int i;
int main(int param)
{
cout << i << '\n';
int i = 0;
cout << i << '\n';
cout << ::i << '\n';
}
当编译这个程序(使用 Visual Studio 2008)时,它工作正常,输出将是:
10
0
10
这对我来说并不奇怪,这是一个范围问题。
但让我感到困惑的是:mainfile.cpp
文件如何从另一个 .cpp
文件中获取 i
的值(externfile.cpp
在我们的例子中)?仅仅是因为它们位于同一目录中吗?还是相同的解决方案?
更好的方法是:在编译项目时如何“合并”源文件(使用 VS2008,如果我应该指定的话)?他们按什么“顺序”放置?它们的范围如何?
最佳答案
一个“正常”的 VC++ 项目1 指示 VC++ 将每个源文件自己编译成一个“目标文件”(或目标模块),其中编译器为不存在的符号留下“占位符”尚未解决(如声明但未定义的 external
变量或函数)。
然后,链接器将所有目标文件捆绑在一起,将它们捆绑在一起以生成最终的可执行文件。在此段落中,“占位符”被替换为它们引用的代码/数据的实际地址,这些代码/数据在各种目标文件中定义。如果未找到某些需要的定义,则会出现 undefined reference 错误;如果多次找到某个符号,则会出现多重定义错误2。
有关经典链接模型的更多信息,请查看 this article作者:Raymond Chen(如果您有兴趣,请转到 whole series)。
- 当然还有更多的灵 active 空间,这里我只是描述 VC++ 中的常见情况。
- 这是C++“单一定义规则”的结果;尽管如此,还是有一些异常(exception),特别是
inline
函数和template
实例化;在这些情况下,链接器只接受它喜欢的任何内容(这应该不是问题,因为此类对象的多个定义必须相同)。
关于c++ - 编译时如何处理 C++ 解决方案源文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14420611/