控制符号可见性的标准方法

时间:2017-01-24 19:24:05

标签: c++ c++14

在C ++中使用C和普通函数,我可以使用static关键字阻止导出函数符号:

static int foo(int a, int b) { /* ...  */ }

但是在一个类中,将函数定义为static具有完全不同的含义。有没有办法确保编译器我的整个类只能在模块中使用,而且不需要导出它的任何方法符号?

3 个答案:

答案 0 :(得分:7)

使用匿名命名空间。

namespace
{
    class C
    {
        C() {}
        void f() {}
    };

    void f();
}

class ExportedClass
{
    ExportedClass() {}
    void f() {}
};

void exportedFunction() {}

正如您所看到的,您也应该为正常功能执行此操作。不建议使用static

答案 1 :(得分:5)

您可以使用匿名命名空间。例如,

// file foo.cc
namespace {
    int symbol1 = 0;
    struct auxiliary { /* ... */ } symbol2;
}

void foo(int x)
{
  // uses symbol1 and symbol2
}

symbol1symbol2不“可见”时。

答案 2 :(得分:-4)

根据您的需要以及为什么这样做,您可以将类移动到.cpp文件中。例如,如果您要实现库,则可以使用此方法。请查看Putting class declaration in .cpp file

上的讨论

更具体地说,您的课程应该使用独立的翻译单元,远离主要课程,远离课程以外的课程。