C++ 什么';s宏“LIBCPP”模板“u VIS in”的用法;类“LIBCPP”模板“相对于向量”;

C++ 什么';s宏“LIBCPP”模板“u VIS in”的用法;类“LIBCPP”模板“相对于向量”;,c++,c++11,macros,libc++,C++,C++11,Macros,Libc++,与标准库类vector一样,声明总是这样 “类_LIBCPP_模板_visvector” 不知道为什么会在class关键字和类名之间插入宏。这是一个符号可见性宏。其原因是为了确保编译标志不会影响std::vectorABI。使用叮当声,它将扩展为\uuuuuuu属性((\uuuu可见性\uuuuuu(“默认”))。宏允许它适应不同的编译器/平台,如中所述: Libc++使用各种“可见性”宏以提供稳定的 库和标头中的ABI。这些宏通过更改 符号的可见性和内联特性 适用于 \u LIBCPP\u

与标准库类vector一样,声明总是这样 “类_LIBCPP_模板_visvector”


不知道为什么会在class关键字和类名之间插入宏。

这是一个符号可见性宏。其原因是为了确保编译标志不会影响
std::vector
ABI。使用叮当声,它将扩展为
\uuuuuuu属性((\uuuu可见性\uuuuuu(“默认”))
。宏允许它适应不同的编译器/平台,如中所述:

Libc++使用各种“可见性”宏以提供稳定的 库和标头中的ABI。这些宏通过更改 符号的可见性和内联特性 适用于

\u LIBCPP\u TEMPLATE\u VIS

将类型的typeinfo和vtable标记为具有默认可见性。这 宏对类型成员函数的可见性没有影响

GCC行为:GCC不支持Clang的type_可见性(…) 属性在GCC中,使用可见性(…)属性和成员 功能受到影响

Windows行为:DLL不支持类上的dllimport/export 模板。宏在此平台上的定义为空


另请参阅文档。

您在谈论哪个编译器?可能与苹果Xcode i使用的@RSahu LLVM实现重复guess@newonelei为什么他们使用
class\u LIBCPP\u TEMPLATE\u VIS vector
而不是
class\u attribute\u(…)vector
?这是因为他们可以简单地删除编译器特定的
\uuuuu属性(如果它在不同的编译器上使用)(或者有关闭它们的选项),并且他们还可以在多个类似属性之间进行选择(他们可以在
\uu属性(默认)和
属性(默认)之间进行选择)__(“默认设置”))