相关疑难解决方法(0)

为什么实现文件中的自由函数默认没有内部链接?

当涉及到函数(C++ 中的非成员函数)时,将它们标记为静态会赋予它们内部链接。这意味着它们在翻译单元之外不可见。为什么这不是默认值?我没有很好的统计数据,但从我所看到的实现文件中的大多数函数应该标记为静态。

我相信共识是​​将功能分割成更小的单元。因此,一般来说,实现文件中不应该在其他翻译单元中可见的“实用程序”类函数的数量大于只是公共接口的实现的函数的数量,这是有道理的。

在这种情况下,他们默认选择“导出所有内容”的原因是什么?

c c++

16
推荐指数
4
解决办法
1732
查看次数

符号可见性和命名空间

我正在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不同?

c++ gcc visibility symbols

12
推荐指数
1
解决办法
2万
查看次数

Modern/2020 从 Python 调用 C++ 代码的方法

我正在尝试从 Python 脚本调用 C++ 函数。从 2010 年到 2015 年,我在 Stackoverflow 上看到了不同的解决方案,但它们都使用复杂的包,并希望有更简单/更新和更复杂的东西。我试图调用的 C++ 函数接受一个双变量并返回一个双变量。

double foo(double var1){
    double result = ...
    return result;
}
Run Code Online (Sandbox Code Playgroud)

c++ python

7
推荐指数
1
解决办法
2144
查看次数

标签 统计

c++ ×3

c ×1

gcc ×1

python ×1

symbols ×1

visibility ×1