如何让 g++ 强制我遵守 C++ 标准
How to make g++ force me to adhere to C++ standard
我正在尝试学习 C++,但以前没有使用它或 C 的经验,我看到一些培训材料有时试图教我 C 编码而不是 C++。
由于我没有足够的知识来辨别这些书是否试图教我正确的 C++,我想我可以在 g++ 编译器上设置一些参数来解决这个问题。
所以我的问题是:
如何设置Windows中的g++编译器,如果我写的不是纯C++标准,他就不会编译?
非常感谢
没有一个编译器是完美的(大多数都没有 100% 严格按照法律条文执行任何特定的 C++ 标准),但是您可以将警告调高,然后让它们出错:
g++ source.cpp -Wall -Wextra -pedantic -Werror
这将导致大多数 non-standard 行为被彻底拒绝;但是,它也会将一些警示故事变成错误,这可能是您想要的也可能不是您想要的。
根据您的最佳判断来决定是否要使用 -Werror
。就个人而言,我会推荐它,除非你被迫不被要求包含 badly-written third-party 库 headers.
不过,如果某些警告妨碍了您,您始终可以排除它们;例如通过附加 -Wno-unused-variable
.
请查阅您的工具链文档以了解可用的警告开关。
不会 做的是检测 standard-compliant C++ 代码中的 C 习语。那是不可能的。
为此,你有更好的书籍、代码审查会议和你的良心。 :)
How can I set the g++ compiler in Windows so that he won't compile if what I am writing is not pure C++ standard?
你不能。我同意@Lightness 在他的回答中所说的大部分内容。警告您 可能 调用未定义行为的所有方式(其中一些在编译时甚至检测不到)不是编译器的工作。
但是,我不同意他在回答中将 -Wall -Wextra -pedantic
等同于“警告出现得很高”的部分。
引用 GCC 手册 (v5.2) 中选项的实际含义,强调我的:
-Wall
This enables all the warnings about constructions that some users consider questionable, and that are easy to avoid [...]
-Wextra
This enables some extra warning flags that are not enabled by -Wall.
-pedantic
Issue all the warnings demanded by strict ISO C and ISO C++ [...]
并非所有“非纯 C++”的构造实际上都需要标准警告。有很多东西甚至 -Wall -Wextra -pedantic
也不能保护你免受伤害,还有很多东西很可能是编程错误但标准没有涵盖(例如 -Wsign-conversion
、-Wswitch-default
、-Wlogical-op
, -Woverloaded-virtual
...)
所以这里的建议是,拿起编译器手册,检查所有可用的警告选项,选择您可以接受的最严格的设置。定期重复该过程。
我正在尝试学习 C++,但以前没有使用它或 C 的经验,我看到一些培训材料有时试图教我 C 编码而不是 C++。
由于我没有足够的知识来辨别这些书是否试图教我正确的 C++,我想我可以在 g++ 编译器上设置一些参数来解决这个问题。 所以我的问题是:
如何设置Windows中的g++编译器,如果我写的不是纯C++标准,他就不会编译?
非常感谢
没有一个编译器是完美的(大多数都没有 100% 严格按照法律条文执行任何特定的 C++ 标准),但是您可以将警告调高,然后让它们出错:
g++ source.cpp -Wall -Wextra -pedantic -Werror
这将导致大多数 non-standard 行为被彻底拒绝;但是,它也会将一些警示故事变成错误,这可能是您想要的也可能不是您想要的。
根据您的最佳判断来决定是否要使用 -Werror
。就个人而言,我会推荐它,除非你被迫不被要求包含 badly-written third-party 库 headers.
不过,如果某些警告妨碍了您,您始终可以排除它们;例如通过附加 -Wno-unused-variable
.
请查阅您的工具链文档以了解可用的警告开关。
不会 做的是检测 standard-compliant C++ 代码中的 C 习语。那是不可能的。
为此,你有更好的书籍、代码审查会议和你的良心。 :)
How can I set the g++ compiler in Windows so that he won't compile if what I am writing is not pure C++ standard?
你不能。我同意@Lightness 在他的回答中所说的大部分内容。警告您 可能 调用未定义行为的所有方式(其中一些在编译时甚至检测不到)不是编译器的工作。
但是,我不同意他在回答中将 -Wall -Wextra -pedantic
等同于“警告出现得很高”的部分。
引用 GCC 手册 (v5.2) 中选项的实际含义,强调我的:
-Wall
This enables all the warnings about constructions that some users consider questionable, and that are easy to avoid [...]
-Wextra
This enables some extra warning flags that are not enabled by -Wall.
-pedantic
Issue all the warnings demanded by strict ISO C and ISO C++ [...]
并非所有“非纯 C++”的构造实际上都需要标准警告。有很多东西甚至 -Wall -Wextra -pedantic
也不能保护你免受伤害,还有很多东西很可能是编程错误但标准没有涵盖(例如 -Wsign-conversion
、-Wswitch-default
、-Wlogical-op
, -Woverloaded-virtual
...)
所以这里的建议是,拿起编译器手册,检查所有可用的警告选项,选择您可以接受的最严格的设置。定期重复该过程。