为什么标记为“隐藏”的函数在gcc 4中从外部模块调用时不会抛出错误?

时间:2014-07-02 17:57:19

标签: c++ c gcc

我正在使用gcc。 4.4.7。如果我将一个函数标记为隐藏在模块A.h:

//module A.h
__attribute__ ((visibility ("hidden"))) void foo() { ... }

我显然仍然可以在模块A.h中调用foo。如果我有第二个模块B.h引用A :: foo:

//module B.h
#include "A.h"
foo();

为什么不抛出错误?如果A :: foo在模块B中在技术上未定义?

编辑已移除“在模块B中调用foo时没有任何反应”。有些代码设置错误

edit2 我正在查看this tutorial在头文件中设置本地引用,以便无法从其他模块调用它们。也许我错过了什么?

edit3 我正在使用-fvisibility = hidden

2 个答案:

答案 0 :(得分:3)

Quote from the GCC Manual:

  

可见性(" visibility_type")

     

此属性会影响它所附加的声明的链接。有四个受支持的visibility_type值:默认值,隐藏,受保护或内部可见性。

     

[...]

     

隐藏

     

隐藏的可见性表示声明的实体具有新的链接形式,我们将其称为“隐藏链接”。具有隐藏链接的对象的两个声明如果它们位于相同的共享对象中,则引用相同的对象。

链接在一起的两个编译单元位于相同的共享对象

答案 1 :(得分:0)

您是否使用-fvisibility = hidden标志编译此代码?如果是,请尝试

#pragma GCC visibility push(hidden)