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]]   这些都是什么鬼?

 

posted @ 2018-03-13 16:00  thomas76  阅读(347)  评论(0编辑  收藏  举报