我正在阅读一本C++书(C++ primer),现在有一件我无法弄清楚的东西。
为什么如果我有2个不同的cpp文件,并且我声明&在这些文件中定义了一个具有相同名称的变量,编译器会给我一个链接错误?文件的变量是本地的吗?C++关于变量
C++关于变量
回答
变量本地文件?编号
与h文件相反,cpp文件没有特别的特别之处;当你编译一个cpp文件(比如说,以标准的方式,到一个.o)时,引入h文件的#include
只是简单地将h文件注入到编译流中。这方面的头文件是组织实体。
您可以将int foo;
放在一个cpp文件中,extern int foo;
放在另一个文件中,将每个文件编译为一个目标文件并将它们链接在一起。第二个文件然后可以访问第一个文件中的同一个对象(extern int foo;
被推入到cpp文件中的事实实际上并不相关)。出于同样的原因,将int foo;
放置在两个不同的cpp文件中时,将它们链接在一起时会产生歧义。
为了确保INT FOO在一个转换单元(编译的.o/obj文件,如果你会)真的只由单位,你可以做两件事情之一:
- 声明foo对象是静态的,如下所示:
static int foo;
这个变量不受外部链接影响;它对一个翻译单位来说是真正的私人。 把int对象在具名命名空间,如下所示:
namespace { // Foo is in a unique namespace for this object file int foo; }
这种特殊的构建体产生用于每个转换单元唯一的命名空间。这会导致跨目标文件的每个foo对象都是不同的。
谢谢!很好的解释。所以.h文件的目的是告诉编译器哪些方法/函数/其他东西在其他.cpp中,然后让你在你想要的任何.cpp中使用它们,对吧? – 2014-09-06 19:32:55
不完全。 cpp中的代码和h中的代码看起来与编译器相同,并且处理方式相同。 h文件仍然是你放置共同实体的地方;在这种情况下,声明 - 'extern int foo;'。这样,任何想在您的cpp文件中使用int的人都可以#包含您的h文件,并将'extern int foo;'注入到它们的代码中。这是为了您的利益,而不是编译器。 – 2014-09-06 19:46:37
如果用static
关键字声明变量,它们将是相应编译单元的本地变量,并且不会收到错误。否则,它们是全球性的,应该可以访问整个程序,因此会产生错误。
- 1. 关于传递变量用C
- 2. 关于一个具体的C变量
- 3. 关于DOM的变量
- 4. 关于变量和选择
- 5. 关于变量名称
- 6. 关于全局变量
- 7. 关于PHP $ _SESSION变量
- 8. Python - 关于变量声明
- 9. 有关的变量在C#
- 10. 关于返回一个未初始化的变量(C/Obj-C)
- 11. 关于变量值的变化。
- 12. 关于引用变量和C#中的变量传递的简单问题
- 13. 混淆关于变量的范围用C
- 14. 记忆mgmt关于记忆变量的问题 - 客观c
- 15. 与相关联的类的变量在C#(用于JSON)
- 16. 新手:关于一个类中的ios/objective -c变量定义
- 17. 未关闭变量的关闭变量
- 18. 关于volatile变量的使用
- 19. 基于关键变量的CSS调整
- 20. 关于打印出os.environ变量
- 21. 关于变量类型“double”的问题
- 22. 关于Node.js中的全局变量
- 23. 关于SEE_MASK_NOZONECHECKS环境变量的文档
- 24. 关于Swift中的变量类型
- 25. 关于Node.js中的局部变量promise
- 26. 关于shell脚本-env变量
- 27. 关于FreeSWITCH callID变量的困惑
- 28. 关于访问私有成员变量
- 29. 关于变量赋值(Python)的困惑
- 30. 关于变量初始化顺序
你能提供一个例子吗? – 2014-09-06 17:09:30