合规国际互联网加速 OSASE为企业客户提供高速稳定SD-WAN国际加速解决方案。 广告
# 属性(Attributes) “属性”是C11标准中的新语法,用于让程序员在代码中提供额外信息。相较于风格各异的传统方式(__attribute__, __declspec, #pragma等),“属性”语法致力于将各种“方言”进行统一。 与传统语法不同的是,“属性”语法相当灵活,可以随处添加,且总是作用于与之相邻的语法实体。 ``` void f [[ noreturn ]] () // f() 永不返回 { throw "error"; // 虽然不得返回,但可以抛出异常 } struct foo* f [[carries_dependency]] (int i); // 编译优化指示 int* g(int* x, int* y [[carries_dependency]]); ``` 正如你看到的那样,属性被放置在两个双重中括号“[[…]]”之间。目前,noreturn和carries_dependency是C++11标准中仅有的两个通用属性。 我们有理由担心属性的大量使用会引起C++语言的混乱,很可能将产生很多C++语言的“方言”。 所以,我们推荐仅在不影响源代码的业务逻辑的前提下,才使用属性来帮助编译器作更好的错误检查(例如,[[noreturn]],或者是帮助代码优化(例如, [[carries_dependency]])。 在未来的计划中,属性的一个重要用途是为OpenMP提供更好的辅助信息。例如: ``` // 使用[[omp::parallel()]]属性告诉编译器,这个for循环可以并行执行 for [[omp::parallel()]] (int i=0; i<v.size(); ++i) { // ... ``` 就像上面的代码展示的那样,通过指定for循环的[[omp::parallel()]]属性,编译器将使用OpenMP对这个for循环进行并行化处理,从而这个for循环将并行执行。 参考文献: Standard: 7.6.1 Attribute syntax and semantics, 7.6.3-4 noreturn, carries_dependency 8 Declarators, 9 Classes, 10 Derived classes, 12.3.2 Conversion functions [N2418=07-027] Jens Maurer, Michael Wong: Towards support for attributes in C++ (Revision 3)