【问题标题】:namespaces from header files in c++C ++中头文件的命名空间
【发布时间】:2014-03-20 17:04:41
【问题描述】:

我创建了一个 noname 命名空间,其中包含一些变量在标题中,想在 .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;
}

【问题讨论】:

    标签: c++ namespaces header-files


    【解决方案1】:

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

    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;
    }
    

    ma​​in.cpp #包括 #include "未命名.h"

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

    输出是

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

    【讨论】:

      【解决方案2】:

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

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

      要么在命名空间本身中初始化变量,要么在函数中为它们赋值。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 2010-11-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-08-05
          • 1970-01-01
          • 1970-01-01
          • 2010-09-26
          • 1970-01-01
          相关资源
          最近更新 更多