5. 命名空间声明和实现分离

在上述的示例中。我们通常在声明名字空间的时候就已经将函数的实现等加入到名字空间中。而在实际工作中,通常我们要将名字空间中的变量、函数、类的声明写在 .h 的头文件中,而将具体的函数、成员函数(后面才讲)等的实现写在 .cpp 文件中。

以如下的名字空间声明为例:

namespace english_env {
    const char * mystr = "Hello";
    void say_hello(const char * name) {
        std::cout << mystr <<" "<< name <<std::endl;
    }
}

namespace chinese_env {
    const char * mystr = "你好";
    void say_hello(const char * name) {
        std::cout << mystr <<" "<< name <<std::endl;
    }
}

通常我们拆分成声明部分和实现部分,假设我们将声明部分写在 language.h 头文件中,将实现部分写在 language.cpp 中。则拆分后的两个文件如下:

language.h文件内容如下:

#ifndef __LANGUAGE_H__
#define __LANGUAGE_H__

namespace english_env {
    extern const char * mystr;
    void say_hello(const char * name);
}

namespace chinese_env {
    extern const char * mystr;
    void say_hello(const char * name);
}

#endif /* __LANGUAGE_H__ */

language.cpp 文件内容如下:

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

namespace english_env {
    const char * mystr = "Hello";
    void say_hello(const char * name) {
        std::cout << mystr <<" "<< name <<std::endl;
    }
}

namespace chinese_env {
    const char * mystr = "你好";
    void say_hello(const char * name) {
        std::cout << mystr <<" "<< name <<std::endl;
    }
}

这样我们将名字空间中变量和函数的声明部分写入到了 .h 文件中。接下来我们在任意地方只要包含头文件 language.h 就可以使用名字空间中的标识符了。

比如 使用的该名字空间的 main.cpp 中只要包含该头文件即可,如下所示:

main.cpp 文件内容如下:

#include <iostream>

#include "language.h"

int main(int argc, char * argv[]) {
    // 使用名字空间中的变量
    std::cout << english_env::mystr << std::endl;
    std::cout << chinese_env::mystr << std::endl;

    return 0;
}

编译和运行结果如下:

weimz@mzstudio:~$ g++ -c language.cpp 
weimz@mzstudio:~$ g++ -c main.cpp 
weimz@mzstudio:~$ g++ -o mynamespace main.o language.o 
weimz@mzstudio:~$ ./mynamespace 
Hello
你好

实验:

复制上述的代码,对其进行修改,然后编译并运行。