C++ [[attribute]]
考虑下面的代码:
int x=1; switch (x) { case 1: std::cout << "x==1" << std::endl; case 2: std::cout << "x<=2" << std::endl; break; case 3: std::cout << "x==3" << std::endl; break; }
case 1:是否忘记书写break;还是有意放过,意图继续执行case 2?编译器当然不会弄明白了,就报告一个警告。
传统的解决方法是(VS环境):
#pragma warning( push )
#pragma warning( disable : 4705 )
// Some code
#pragma warning( pop )
把代码弄了个大花脸。现在有C++17的现代方式:
int x=1; switch (x) { case 1: std::cout << "x==1" << std::endl; [[fallthrough]]; case 2: std::cout << "x<=2" << std::endl; break; case 3: std::cout << "x==3" << std::endl; break; }
考虑如下代码:
int main() { bool b=true; }
编译器会warning警告b未使用。有许多传统技术解决这个问题,例如VS的UNREFERENCED_PARAMETER不具有可移植性。C++17带来了可移植的:
int main() { [[maybe_unused]] bool b=true; }
标记过时的程序实体:过时的函数,类,变量等。传统做法是用编译器厂家独特的指令。
#if GCC_VERSION_AT_LEAST(3,1) # define attribute_deprecated __attribute__((deprecated)) #elif defined(_MSC_VER) # define attribute_deprecated __declspec(deprecated) #else # define attribute_deprecated #endif attribute_deprecated void old_function(int);
C++17 的现代化机制:
[[deprecated]] void old_function(){} int main() { old_function(); //警告您正在使用过时函数 }
还有其它稀奇古怪的属性,待研究:
[[noreturn]]
[[carries_dependency]]
[[optimize_for_synchronized]] 这些都是什么鬼?