我有一个程序,除了 main.cpp 和一个常量头之外,还有两个外部文件。所以总共有四个文件。它们包含以下代码:
主要.cpp
#include <iostream>
using namespace std;
int ext1_func();
int ext2_func();
int main()
{
int i;
i = ext1_func();
cout << i << endl;
i = ext2_func();
cout << i << endl;
return 0;
}
ext1.cpp
#include "const.h"
int asd1=1;
int ext1_func()
{
return temp_int;
}
ext2.cpp
#include "const.h"
int asd2 = 2;
int ext2_func()
{
return temp_int;
}
常量.h
#ifndef CONST_H
#define CONST_H
const int temp_int=1;
#endif
我想要的是:
1) 在 ext1.cpp 中声明的任何变量都应该仅为 ext1.cpp 中的函数所知,对于 ext2.cpp 也是如此。因此,对于“ext2_func”,“asd1”必须只为“ext1_func”和“asd2”所知。
2) "exp1.cpp"和 "ext2.cpp"中的函数必须能够看到 "const.h"中定义的所有值
我相信我编写并附上的代码满足这些要求,但我想问一下我做的是否正确?有没有比我建议的方法更容易获得所需行为的方法?
提前致谢。
奈尔斯。
最佳答案
在编译单元级别,您在“全局”范围声明的符号都链接到全局变量空间。
避免这种情况的旧方法是将它们声明为静态的。新的方法是将它们放入一个匿名命名空间中。它们也可以在那里被声明为静态的。
ext1.cpp
namespace {
/*static*/ int asd1=1;
}
header中的const是可以的,这样声明的常量有一个特殊的地位,事实上编译器可以在代码中替换这个值。但理想情况下,您至少应该将它们包装在一个(命名的)命名空间中,以避免污染全局命名空间。修改值(使用 const_cast)将是未定义的行为。
如果它是非常量并且您真的想要一个全局的(通常不是一个好主意)您需要在 header 中使用 extern 关键字,然后在单个编译单元中创建它的实例。
关于c++ - 多文件程序中的作用域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12953264/