考虑下面的代码:
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#endifattribute_deprecated void old_function(int);
C++17 的现代化机制:
[[deprecated]] void old_function(){}int main(){ old_function(); //警告您正在使用过时函数}
还有其它稀奇古怪的属性,待研究:
[[noreturn]]
[[carries_dependency]][[optimize_for_synchronized]] 这些都是什么鬼?