gpt4 book ai didi

c++ - GCC 6.x 关于 lambda 可见性的警告

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:28:07 25 4
gpt4 key购买 nike

我正在构建一个包含一堆 lambda 的共享库,其中一些 lambda 是在其他 lambda 中创建的。但是,当我使用 -fvisibility=hidden 和 -Wall 时,我会收到有关声明具有更高可见性的警告,老实说我不明白。我有一个最小的例子:

#include <memory>
template<class T>
class MyClass {
public:
MyClass() {
#if 0
auto fn = [this] { /*Do something useful here*/ };
auto outer = [this,fn]() { /*use fn for something here*/ };
#else
auto outer = [this]()
{
auto fn = [this] { /*Do something useful here */ };
//use fn for something here
};
#endif
/* use outer for something */
}
};
int main() { MyClass<int> r; }

如果我编译它,我会收到以下警告:

% g++    -Wall -fvisibility=hidden -Wno-unused-but-set-variable  -o visibility_test.cpp.o -c visibility_test.cpp
visibility_test.cpp: In instantiation of ‘struct MyClass<T>::MyClass()::<lambda()> [with T = int]::<lambda()>’:
visibility_test.cpp:13:22: required from ‘MyClass<T>::MyClass()::<lambda()> [with T = int]’
visibility_test.cpp:11:23: required from ‘struct MyClass<T>::MyClass() [with T = int]::<lambda()>’
visibility_test.cpp:11:14: required from ‘MyClass<T>::MyClass() [with T = int]’
visibility_test.cpp:22:27: required from here
visibility_test.cpp:13:32: warning: ‘MyClass<T>::MyClass()::<lambda()> [with T = int]::<lambda()>’ declared with greater visibility than the type of its field ‘MyClass<T>::MyClass()::<lambda()> [with T = int]::<lambda()>::<this capture>’ [-Wattributes]
auto fn = [this] { /*Do something useful here */ };

如果我将#if 0 更改为#if 1,从而将 fn 的创建移动到“外部”lambda 之外,它都可以正常编译。

当我在我的 Arch box 上安装 GCC 6 时,这个警告开始出现。我在使用 6.3.1 和 7.1.1 编译时得到它。

所以,我的问题是:

  1. 这个警告想告诉我什么?
  2. 如何在不必过多违反我的代码的情况下摆脱警告(像我的示例中那样移动 lambda 并不是一个真正的选择。)

更新:因此,我已经接受这是 GCC 中的错误,现在我想以最小的副作用摆脱警告。所以我在 MyClass 的构造函数中添加了“__attribute__ ((visibility ("default")))”,这看起来工作得很好。

最佳答案

看起来这是 gcc 中的错误。

bug report并且在没有 lambda 的情况下也有相同的警告。您可以使用默认的 -fvisibility 来处理这个问题,或者通过属性手动设置隐藏/默认的可见性。

关于c++ - GCC 6.x 关于 lambda 可见性的警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44390898/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com