来自c ++中头文件的名称空间

时间:2014-03-20 17:04:42

标签: c++ namespaces header-files

我在头文件中创建了一个包含一些变量的noname命名空间,想要在.cpp中初始化它们并在main.cpp中查看。一个noname命名空间我希望工作得很好而不提及.cpp中的这个命名空间。但是我得到的错误好像在.cpp中我有全新的a和b。任何人都知道如何解决它?

xx.h

namespace
{
    int a;
    int b;
}

的.cpp

#include "xx.h"
a = 5;
b = 10;

的main.cpp

#include <iostream>
#include "xx.h"
int main()
{
       std::cout << "values" << a << b << std::endl;
}

3 个答案:

答案 0 :(得分:2)

您不能在函数外部使用赋值语句。您只能声明或/和定义对象。所以有效的代码将是

namespace
{
    int a = 5;
    int b = 10;
}

的main.cpp

#include <iostream>
#include "xx.h"
int main()
{
       std::cout << "values" << a << b << std::endl;
}

考虑在未命名的命名空间中声明的对象具有内部链接。这意味着如果此标头包含在多个模块中,则在每个模块中它声明一个单独的命名空间。

构建以下示例

unnamed.h

namespace
{
    int a = 5;
    int b = 10;
}

void f();

second.cpp

#include <iostream>
#include "unnamed.h"

void f()
{
    a = 10; b = 5;
    std::cout << "a = " << a << ", b = " << b << std::endl;
}

的main.cpp 的     #包括     #include“unnamed.h”

int main()
{
    f();
    std::cout << "a = " << a << ", b = " << b << std::endl;

    return 0;
}

输出

a = 10, b = 5
a = 5, b = 10

答案 1 :(得分:0)

问题不在于匿名命名空间。无法在全局范围内分配变量。

// At global scope
int num;

num = 10;  // Error. You are doing something similar.

初始化命名空间本身的变量或在函数中赋值。

答案 2 :(得分:0)

你的标题必须将它们声明为extern,而在cpp中你必须定义它们。 (否则任何包含文件都会创建自己的ab

这可能有效(因为匿名命名空间而非常不确定):

xx.h

namespace
{
    extern int a;
    extern int b;
}

的.cpp

#include "xx.h"
int a = 5;
int b = 10;

的main.cpp

#include <iostream>
#include "xx.h"
int main()
{
       std::cout << "values" << a << b << std::endl;
}