Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ &引用;“私人”;cpp文件中命名空间作用域中的变量_C++ - Fatal编程技术网

C++ &引用;“私人”;cpp文件中命名空间作用域中的变量

C++ &引用;“私人”;cpp文件中命名空间作用域中的变量,c++,C++,在源文件(不是头文件)中,我习惯于放置一些只有实现才能处理的状态: //.cpp namespace foo{ someType bar; //... functions and objects that might use bar ... } 由于bar仅在此cpp文件中声明,其他代码文件不可能使用它,对吗 但是请注意,我没有将static放在它前面。不过,在这种情况下,这应该没有什么区别吧 如果没有static,唯一的区别是,如果在其他文件(header或cpp)中,我

在源文件(不是头文件)中,我习惯于放置一些只有实现才能处理的状态:

//.cpp

namespace foo{

   someType bar;

   //... functions and objects that might use bar ...

}
由于
bar
仅在此cpp文件中声明,其他代码文件不可能使用它,对吗

但是请注意,我没有将
static
放在它前面。不过,在这种情况下,这应该没有什么区别吧

如果没有
static
,唯一的区别是,如果在其他文件(header或cpp)中,我对同一个变量名有
extern
声明,那么这个变量可以被另一个代码文件访问(并实际设置)吗?(当然,该声明位于相同名称的命名空间中)


由于我在代码库的其他地方没有任何这样的
extern
声明,因此我推断,无论我是否将其标记为
static
,都没有区别——但我想确保我的想法是正确的。

您是正确的,命名空间范围中变量的静态仅控制来自其他转换单元(内部链接与外部链接)的变量的可见性。除此之外,变量的行为将保持不变。例如,it存储类将保持静态。唯一的区别是没有
静态
声明

namespace foo{
    extern someType bar;
    ...
}

其他翻译单元将“连接”到您的代码> Bar < /C>变量,而<>代码> static < /C> > ExtNe/Cuth>在链接时失败。

C++中的模块“私有”变量使用匿名(未命名)命名空间。只在一个文件中声明并不能真正帮助你。只要让它不是全局的,问题就会消失。@Puppy我试图不让全局可变状态,而是让状态与我的单个TU实现隔离。@johnbakers:如果它不在类或函数中,它就是全局的。它仅限于一个TU的事实并不能改变这一点。它只是让它稍微少了一点狗屎,而不是一点狗屎都没有。@pup如果它在名称空间中,那么从技术上讲,它在名称空间的范围内是“全局的”,而不是在项目中,extern是默认的声明,对吗?你真的不需要纠正它吗?