GCC 6.2中[[不赞成]] + __attribute __((可见性("默认")))

时间:2016-11-30 11:00:42

标签: c++ gcc c++14 visibility deprecated

[[deprecated]]__attribute__ ((visibility ("default")))属性与-std=c++14相结合会产生错误(根据使用的顺序expected identifier before ‘__attribute__’expected identifier before ‘[’ token而有所不同)。 单独使用它们不会产生错误。

c ++ 11样式属性[[gnu::visibility("default")]]适用于类,但不适用于函数(代码编译,但产生-Wattributes警告,当使用{{1}构建时,符号被省略})。

这是编译器中的错误(我使用GCC 6.2进行这些测试)还是c ++标准指定的内容?相同的代码(-fvisibility=hidden)按预期使用clang工作。

这是我用于测试以结合所有可能性的代码,产生所需结果的唯一情况(不建议使用+默认可见性)是3和7,即使用旧样式属性的那些。

[[deprecated]] __attribute__ ((visibility ("default")))

foo.h

#if defined(X_VERSION) # if (X_VERSION % 4) == 0 // 0 4 8 12 # define DEPRECATED [[deprecated]] # define VISIBILITY [[gnu::visibility("default")]] # elif (X_VERSION % 4) == 1 // 1 5 9 13 # define DEPRECATED [[deprecated]] # define VISIBILITY __attribute__ ((visibility ("default"))) # elif (X_VERSION % 4) == 2 // 2 6 10 14 # define DEPRECATED __attribute__((__deprecated__)) # define VISIBILITY [[gnu::visibility("default")]] # elif (X_VERSION % 4) == 3 // 3 7 11 15 # define DEPRECATED __attribute__((__deprecated__)) # define VISIBILITY __attribute__ ((visibility ("default"))) # else # error "Invalid X_VERSION" # endif # if (X_VERSION / 4) == 0 // 0 1 2 3 # define DEPRECATED_API DEPRECATED VISIBILITY # elif (X_VERSION / 4) == 1 // 4 5 6 7 # define DEPRECATED_API VISIBILITY DEPRECATED # elif (X_VERSION / 4) == 2 // 8 9 10 11 # define DEPRECATED_API DEPRECATED # elif (X_VERSION / 4) == 3 // 12 13 14 15 # define DEPRECATED_API VISIBILITY # else # error "Invalid X_VERSION" # endif #else # error "X_VERSION not defined" #endif #if defined(DEPRECATED_API) # define XSTR(x) STR(x) # define STR(x) #x # pragma message "DEPRECATED_API = " XSTR(DEPRECATED_API) #endif class DEPRECATED_API foo { public: foo(); virtual ~foo(); void test(); int a; }; void DEPRECATED_API a_function();

foo.cpp

#include <foo.h> foo::foo() {} foo::~foo() {} void foo::test() {} void a_function() {}

CMakeLists.txt

1 个答案:

答案 0 :(得分:1)

经过很多时间,我发现:

void [[deprecated]] [[gnu::visibility("default")]] a_function();

应该是:

 [[deprecated]] [[gnu::visibility("default")]] void a_function();

在这种情况下,版本0和版本4都按预期工作。