我认为如果默认情况下打开-Wall
标志会很好,不会有多坏。如何像这样配置 GCC?
除了从源代码编译一些大型程序时,很多警告会淹没您的终端之外,这有什么缺点吗?
如果你使用 bash 作为你的 shell,请将这些行添加到你的 ~/.bashrc 中。
alias gcc='gcc -Wall'
更新:
您可以在 https://superuser.com/questions/519692/alias-gcc-gcc-fpermissive-or-modifying-configure-script 上参考此问题
如果使用 make,则需要从 .bashrc 中覆盖 make 的变量 CC 和 CXX:
export CC="gcc -wall"
export CXX="g++ -wall"
Juzzlin建议一个好的方法是为gcc编写一个包装器。 Marc Glisse还建议,写一个是实现我想要的东西的最佳方式。这就是我所做的。
我做了一个bash脚本,为我调用gcc:
#!/bin/sh
echo -n "Compiling $1..."
gcc -Wall -Werror -o $(basename $1 .c).out $1
a=$?
if [[ "$a" -eq 1 ]]; then
echo "Failed!"
else
echo "Done."
echo "Executing:"
./$(basename $1 .c).out
fi
然后我把脚本复制到/usr/bin
并使其可执行:
sudo cp car /usr/bin
chmod +x /usr/bin/car
(脚本的名称是car
,代表"编译并运行")因此,每当我想编译源文件并运行它时,我都会键入:
car mysourcefile.c
正如评论中所讨论的(尽管它不是对您的问题的直接回答),使用 Makefile 有很多好处。它提供了一个放置构建命令的地方,如果您只使用 make
构建,它将始终保持最新状态。它还简化了在每次构建时运行测试的过程。
编写测试是一个好习惯,即使你只是在为家庭作业处理一小段无关紧要的代码。它允许你发现一些愚蠢的错误,否则你会错过,并确保你不会通过修改它(尤其是最后一分钟的修改)来破坏现有的代码。
这样一个 Makefile 的示例(这里除了测试之外,我没有任何东西可以构建,因为它是一个仅标头组件):
all:
g++ -O2 -Wall -Werror -std=c++11 test_polynomial.cc -o test_polynomial -lgmp
g++ -O2 -Wall -Werror -std=c++11 test_g2polynomial.cc -o test_g2polynomial
./test_polynomial --log_level=test_suite
./test_g2polynomial --log_level=test_suite
clean:
rm -f test_polynomial test_g2polynomial
注意:这个例子不是一个很好的例子,因为我什至没有分解CFLAGS
中的构建选项。如果我想添加一个标志,我必须在两个命令中添加它!
另一个好处是,无论语言、依赖项甚至构建系统如何,您始终运行make
进行构建(在使用 scons 或其他构建系统处理项目时,我仍然编写一个 Makefile 执行我在构建和测试时所做的所有命令!
这允许我个人添加它(但在这里我们完全跑题了):我有一个名为 autobuild
的构建脚本,每次我在 vim 中编写文件时都会循环播放。我在屏幕中编码并在屏幕底部的小窗口中运行autobuild
。这样,每个更改都会在我写入文件后立即构建和测试。