C++中当未命名空间跟全局变量在一起的时候,怎么调用未命名空间里的变量

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++中当未命名空间跟全局变量在一起的时候,怎么调用未命名空间里的变量相关的知识,希望对你有一定的参考价值。

C++ primer里的一道程序

int i;
namespace
int i;


如调用全局变量,可以用::i,但是如果想调用未命名空间里的,应该怎么调用?

参考技术A 直接用不就行了?

#include<iostream>
using namespace std;

#define OK 1
#define ERROR 0

int i = 10;
namespace mm
int i = 5;


int main()

cout<<mm::i<<endl;
cout<<i<<endl;
return OK;
本回答被提问者采纳
参考技术B 全局变量,就是"::变量名" 参考技术C 不知道
把分给我吧,大哥,好歹打了了么多
我差分提问题O(∩_∩)O哈哈~谢谢了
参考技术D c语言中文件作用域的全局变量表示方式:
static int i = 0;
c++中进行了扩展, 提供了对应的c++方式, 匿名命名空间:
namespace

int i = 1;


所以
static int i = 0;
int main() return 0;

namespace int i = 0;
int main() return 0;
完全等效, 都是直接::i来调用
这里的i都只能在那个唯一的cpp文件中能够访问, 是文件作用域的全局变量

这一点我记得c++ primer第三版应该提过, 请好好翻一下书或者找对应资料

因为等价于static, 所以下面的代码编译不通过:

int i = 1;
namespace

int i = 2;


int main()

cout << i << endl;


test.cpp
e:\工程\test\test\test.cpp(13) : error C2872: “i”: 不明确的符号
可能是“e:\工程\test\test\test.cpp(6) : int i”
或“e:\工程\test\test\test.cpp(8) : int `anonymous-namespace'::i”

自调函数的写法:

优势:隐式函数(自调函数)里面的参数不会与其它框架的全局变量冲突。

js中常常定义一个函数用做临时的命名空间,在这个命名空间内定义的变量都不会污染到全局命名空间(防止局部变量与全局变量冲突)

普通写法:

function mymodule(){ 
//模块代码 

mymodule(); 

匿名自调函数:

(function(){ 
//模块代码 
}( )); //结束函数定义并立即调用它 

或者:

(function(){ 

})(); 

 

(function(){}()) 外面一个括号的 是直接获取返回值 
里面计算一次
(functuon(){})() 外面2个括号并排的
是先计算前面括号的值 然后执行这个返回值 当然返回的肯定要是函数
前面是包在一起
整体性要好一些

 

以上是关于C++中当未命名空间跟全局变量在一起的时候,怎么调用未命名空间里的变量的主要内容,如果未能解决你的问题,请参考以下文章

自调函数的写法:

C++ Cmath.h 问题导致变量不在全局命名空间中

C++ 从 std::async 函数读取命名空间中的全局变量标志

C++中的静态全局变量

在 Visual Studio 调试器中查看命名空间的全局变量?

[引擎开发] 深入C++内存管理