首页 > 解决方案 > 我应该在源文件中包含包含命名空间定义的标题吗?

问题描述

如果我在头文件和某些源文件中定义了一个名称空间,我不包含该头文件,而是定义一个名称空间与头文件中的名称相同,并声明与头文件中相同的成员,然后添加定义那么我是定义一个新的命名空间还是打开现有的命名空间?

//file.h
#ifndef FILE_H_INCLUDED
#define FILE_H_INCLUDED

namespace mylibNS{
    void foo();
    void bar();
}

#endif // FILE_H_INCLUDED

// foo.cpp
#include <iostream>
//#include "file.h"

namespace mylibNS{
    void foo();
}

void mylibNS::foo(){
    std::cout << "foo()\n";
}

// bar.cpp
#include <iostream>
// #include "file.h"

namespace mylibNS{
    void bar();
}

void mylibNS::bar(){
    std::cout << "bar()\n";
}

// main.cpp
#include <iostream>
using namespace std;
#include "file.h"

int main(int argc, char* argv[]){

    mylibNS::bar();
    mylibNS::foo();
}

标签: c++namespaces

解决方案


通常的做法是file.h在任何需要foobar需要的文件中包含并删除重复的声明。然后,如果一个函数的签名发生变化(或者如果添加了一个新函数),它只需要在一个地方进行更改。它还避免了在两个不同的地方用两个不同的签名声明一个函数的危险。


推荐阅读