美文网首页C++
unnamed namespace

unnamed namespace

作者: Kai_Z | 来源:发表于2018-03-11 23:01 被阅读2次

    简介

    unnamed namespace:未命名的命名空间
    作用: 主要用于取代文件中的静态声明或定义(static)

    c中的static

    在c语言中,如果想定义一个函数仅在本文件中可见,对其他文件都不可见,我们会选择定义静态函数
    例子:假设我们需要一个函数打印一个整数a,打印出来的格式是
    value: a

    //header.h
    #ifndef _HEADER_H
    #define _HEADER_H
    
    void printInterger(int value);
    #endif
    
    //source.cpp,用于实现header.h中的函数
    #include "header.h"
    #include <cstdio>
    #include <iostream>
    
    static void format(int value, char* out)
    {
        std::sprintf(out, "value: %d", value);
    }
    
    void printInterger(int value)
    {
        char buffer[50];
        format(value, buffer);
        std::cout << buffer << "\n";
    }
    //main.cpp
    #include "header.h"
    int main()
    {
        printInterger(20);
        return 0;
    }
    
    //>输出结果
    value: 20
    

    注意:我们在source.cpp中定义了一个静态函数
    static void format(int value, char* out);,主要用于格式化字符串,又不希望其他源文件可以使用这个函数(也就是说该函数只在本文件中可见,其他文件不知道这个函数的存在,也无法使用这个函数),所以我们定义成了静态函数

    c++中的unnamed namespace

    c++中的unamed namespace(未命名的命名空间)就是为了完成与static同样的作用。

    在文件中进行静态声明的做法已经被C++标准取消,现在的做法是使用未命名的命名空间。--《c++ primer》

    //header.h
    #ifndef _HEADER_H
    #define _HEADER_H
    
    void printInterger(int value);
    #endif
    
    //source.cpp,用于实现header.h中的函数
    #include "header.h"
    #include <cstdio>
    #include <iostream>
    
    namespace { // 这就是unnamed namespace,该namespace没有名字
            void format(int value, char* out)
            {
                std::sprintf(out, "value: %d", value);
            }
    }
    
    
    void printInterger(int value)
    {
        char buffer[50];
        format(value, buffer);
        std::cout << buffer << "\n";
    }
    //main.cpp
    #include "header.h"
    int main()
    {
        printInterger(20);
        return 0;
    }
    
    //>输出结果
    value: 20
    

    随便写写

    可能对于刚接触编程的人会想到,我们直接在源文件定义一些函数,但是不在头文件显示这些函数的声明,其他文件是否可以使用这些函数呢?
    答案:通过某些extern 声明之后可以使用

    //header.h
    #ifndef _HEADER_H
    #define _HEADER_H
    void printInterger(int value);
    #endif
    //source.cpp,用于实现header.h中的函数
    #include "header.h"
    #include <cstdio>
    #include <iostream>
    void format(int value, char* out)
    {
        std::sprintf(out, "value: %d", value);
    }
    
    void printInterger(int value)
    {
        char buffer[50];
        format(value, buffer);
        std::cout << buffer << "\n";
    }
    //main.cpp
    /*现在我们将static 或 unnamed namespace 去掉了,如果
    我们想使用format函数,可以在main.cpp中直接声明这个函数,然后就可以直接使用了
    */
    #include "header.h"
    extern void format(int value, char* out);
    int main()
    {  
            char buffer[50];
            format(34,buffer);//此处可以直接调用了
            printInterger(20);
            return 0;
    }
    
    

    相关文章

      网友评论

        本文标题:unnamed namespace

        本文链接:https://www.haomeiwen.com/subject/rckgfftx.html