当涉及到函数(C++ 中的非成员函数)时,将它们标记为静态会赋予它们内部链接。这意味着它们在翻译单元之外不可见。为什么这不是默认值?我没有很好的统计数据,但从我所看到的实现文件中的大多数函数应该标记为静态。
我相信共识是将功能分割成更小的单元。因此,一般来说,实现文件中不应该在其他翻译单元中可见的“实用程序”类函数的数量大于只是公共接口的实现的函数的数量,这是有道理的。
在这种情况下,他们默认选择“导出所有内容”的原因是什么?
我正在Linux和gcc上尝试C++符号可见性.似乎首选的方法是使用-fvisibility = hidden,并根据Visibility gcc wiki页面(http://gcc.gnu.org/wiki/Visibility)逐个导出使用过的符号.我的问题是很多库都没有很好地处理这个问题,他们忘了明确导出符号,这是一个严重的问题.经过几次修复后,甚至某些部分的升压仍可能受到影响.当然,这些错误应该是固定的,但在此之前我想用一种"安全"的方式尽可能地隐藏符号.
我提出了一个解决方案:我将所有符号放在命名空间中,然后使用符号隐藏属性并导出公共接口,这样只会影响我的符号.
问题是,当我针对每个未导出的类编译针对该库的内容时,我收到了警告消息,并且我在应用程序中将其用作类字段.
namespace MyDSO __attribute__ ((visibility ("hidden"))) {
struct Foo {
void bar() __attribute__ ((visibility ("default"))) {}
};
}
struct Bar {
MyDSO::Foo foo;
};
int main() {}
Run Code Online (Sandbox Code Playgroud)
警告消息可以在这个小例子中重现,但当然命名空间应该在应用程序中的另一个类的库中.
$ gcc-4.7.1 namespace.cpp -o namespace
namespace.cpp:7:8: warning: ‘Bar’ declared with greater visibility than the type of its field ‘Bar::foo’ [-Wattributes]
Run Code Online (Sandbox Code Playgroud)
由于我理解符号可见性,隐藏命名空间应该与使用-fvisibility = hidden具有非常相似的效果,但我从未使用后者获得类似的警告.我看到当我将-fvisibility = hidden传递给应用程序时,应用程序中的类也将被隐藏,所以我不会收到警告.但是当我没有通过选项时,标题中的符号似乎都不会被编译器隐藏,所以我不会再收到警告.
这条警告信息的建议是什么?这是一个严重的问题吗?在哪种情况下会导致任何问题?如何隐藏命名空间与fvisibility = hidden不同?
我正在尝试从 Python 脚本调用 C++ 函数。从 2010 年到 2015 年,我在 Stackoverflow 上看到了不同的解决方案,但它们都使用复杂的包,并希望有更简单/更新和更复杂的东西。我试图调用的 C++ 函数接受一个双变量并返回一个双变量。
double foo(double var1){
double result = ...
return result;
}
Run Code Online (Sandbox Code Playgroud)