我应该使用啥标志来强制执行良好的 C++11 样式?
Posted
技术标签:
【中文标题】我应该使用啥标志来强制执行良好的 C++11 样式?【英文标题】:What flag should I use to enforce a good C++11 style?我应该使用什么标志来强制执行良好的 C++11 样式? 【发布时间】:2014-10-05 08:11:56 【问题描述】:我正在学习 C++,并尝试编写好的代码。 我目前正在使用许多编译器标志,例如
-Wextra -Wall -pedantic -Werror -Wfatal-errors -Wcast-qual -Wcast-align -Wconversion -Wdouble-promotion -Wfloat-equal -Wshadow -Wpointer-arith -Weffc++ -ansi -Wstrict-aliasing
我刚刚了解到关键字new
和delete
不应再在C++11 中使用。但是,当我使用它们时,我没有任何警告。
是否有一些标志可用于确保良好的 C++11 风格?
【问题讨论】:
我刚刚了解到在 C++11 中不应再使用关键字 new 和 delete。 你在哪里读到的?你确定你理解对了吗?不鼓励您使用原始指针,因为您以后必须担心释放资源。你无法真正避免使用new
和delete
,而且没有理由这样做。您可以在 std::make_unique()
或 std::make_shared()
等调用后面隐藏使用 new
,但在幕后这些只是对 new
的封装调用。
@Mario:现代 C++ 根本不需要经常使用delete
,许多应用程序最好不要直接调用它(并且很少调用new
)。您质疑 OP 的问题是否纯粹是教条是对的,但如今应用程序代码中的 delete
是一个危险信号。然而,由于现代 C++ 的头文件中有如此多的库代码,即使用户没有编写 delete
也可能出现在编译器中。这就是警告的棘手之处——大多数编译器不会区分“你的”代码和“他们的”代码。
@Mario 的重点是 你 永远不应该使用它们,某些库会这样做。
delete
确实是一个危险信号。 delete[]
是一个更加危险的信号。更一般地说,“1)获取资源,2)做某事,3)释放资源”类型的任何序列都应该将 1 和 3 封装到构造函数/析构函数中,因为如果 2 失败,则自动执行 3。内存管理是一种特殊情况,通常由标准库类处理。
@GingerPlusPlus 它没有提供所有警告。所以,这可能还不够,这取决于你想要什么。
【参考方案1】:
首先,您必须意识到您的编译器永远不会完全强制执行良好的样式。
但是,您可以使用两种技术让编译器帮助您强制执行自己的样式:警告(可以在命令行或编译指示中传递)和毒编译指示。
然而,管理每个编译器版本的确切警告集是很困难的,所以我创建了a list of warnings。请注意,对 clang 的支持很少,它的警告通常不如 gcc 在实践中,尽管他们的营销很棒;此外,无法检测到您使用哪个版本的 clang 来解决错误(特征检测宏毫无价值)。
我还发了a list of poison。
此外,我还有一些 makefile 魔术,可确保将上述两种技术应用于每个适用的文件以及进行一些其他检查。
但是应该注意,每个应用程序都有不同的需求,因此这些标头不应按原样使用。例如,很少有应用程序愿意像我一样毒害std::string
。
【讨论】:
谢谢,我不知道pragma,它做我想要的! 中毒 dynamic_cast 没有什么意义恕我直言,请改用 -fno-rtti。 @Nils rtti 的用处不止dynamic_cast
。以上是关于我应该使用啥标志来强制执行良好的 C++11 样式?的主要内容,如果未能解决你的问题,请参考以下文章