c++头文件中的命名空间

namespaces from header files in c++

本文关键字:命名空间 文件 c++      更新时间:2023-10-16

我在header中创建了一个带有一些变量的命名空间,希望在.cpp中初始化它们,并在main.cpp中查看。一个不具名的命名空间,我希望工作得很好,而不用在.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;
}

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

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# include"unnamed.h"

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

输出为

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

问题不在于匿名命名空间。变量不能在全局范围内赋值。

// At global scope
int num;
num = 10;  // Error. You are doing something similar.

要么在命名空间中初始化变量,要么在函数中赋值

你的头必须声明它们为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;
}