将[[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
答案 0 :(得分:1)
经过很多时间,我发现:
void [[deprecated]] [[gnu::visibility("default")]] a_function();
应该是:
[[deprecated]] [[gnu::visibility("default")]] void a_function();
在这种情况下,版本0和版本4都按预期工作。