📜  C ++ 14中不推荐使用的属性,带有示例(1)

📅  最后修改于: 2023-12-03 14:39:38.066000             🧑  作者: Mango

C++ 14中不推荐使用的属性,带有示例

在 C++ 14 中,有一些属性已经被标记为不推荐使用(Deprecated),这意味着这些属性可能不再受到支持,也可能被移除或替换。在下面的文章中,我们将介绍这些属性及其示例。

[[noreturn]]

[[noreturn]] 是一个函数属性,表示该函数不会返回。这通常用于在函数中引发异常或使用类似于 exit() 的轻量级跳转控制流来让程序终止。[[noreturn]] 可以防止编译器发出警告,提示函数没有返回值。下面是一个示例:

[[noreturn]] void exit_program() {
    std::cout << "Bye!\n";
    exit(0);
}

尽管使用 [[noreturn]] 可以避免编译器发出警告,但应该审慎使用。在某些情况下,[[noreturn]] 可能会使代码更难调试,并且在某些情况下,它可能会导致未定义的行为。

[[deprecated]]

[[deprecated]] 是一个属性,用于将函数、类、变量或类型声明为已被弃用的。这个属性可以帮助开发者了解哪些程序元素已经不再被推荐使用,一旦使用了这些元素,编译器就会发出警告。下面是一个示例:

[[deprecated("Use add() instead")]] int do_add(int a, int b) {
   return a + b;
}

int add(int a, int b) {
   return a + b;
}

int main() {
   do_add(1, 2); //编译器发出警告
   add(1, 2);
}
[[maybe_unused]]

[[maybe_unused]] 是一个变量或函数属性,表示该变量或函数可能未被使用。这通常用于防止编译器发出未使用变量或未使用函数的警告。下面是一个示例:

[[maybe_unused]] int unused_variable;

int main() {
   // unused_variable 没有被使用,
   // 但由于它有 [[maybe_unused]] 属
   // 性,编译器不会发出警告。
}
[[deprecated("message")]] vs. attribute((deprecated("message")))

在 C++ 14 中,可以使用 [[deprecated]] 或 attribute((deprecated)) 来将函数、类、函数指针、变量或类型声明为已弃用的。attribute((deprecated)) 是 GCC 的扩展,可以在 GCC、Clang 和 MSVC 中使用。它的使用方法与使用 [[deprecated]] 相似:

[[deprecated("Use add() instead")]]
int do_add(int a, int b) {
   return a + b;
}

__attribute__((deprecated("Use add() instead")))
int do_add2(int a, int b) {
   return a + b;
}

int add(int a, int b) {
   return a + b;
}

int main() {
   do_add(1, 2); //编译器发出警告
   do_add2(1, 2); //编译器发出警告
   add(1, 2);
}

这两个属性的主要区别在于可移植性和代码干净程度。[[deprecated]] 是 C++ 14 标准的一部分,而 attribute((deprecated)) 是 GCC 扩展。因此,如果您打算编写可移植代码,建议使用 [[deprecated]]。attribute((deprecated)) 会使代码更难读和理解,但是它可以在所有主要的编译器上使用。