gcc永久变更c标准
有没有办法告诉gcc在编译c文件时默认使用c99标准? 我希望避免一直给它gcc永久变更c标准,c,gcc,standards,c99,C,Gcc,Standards,C99,有没有办法告诉gcc在编译c文件时默认使用c99标准? 我希望避免一直给它-std=c99参数。 我假设我可以通过在.bashrc文件中创建一个别名来实现这一点,但这似乎很不雅观。您可以调用c99,而不是gcc(如果您的系统上有gcc的包装器),或者尝试修改您的gcc规范文件。更多信息:这里有一个意想不到的答案。使用Makefile 优点: 只需键入make即可构建 所有选项都会在生成过程中自动处理。 在进行此操作时,请继续并启用所有警告,这样做很好 易于扩展到多个源文件 可以处理涉及不同工具
-std=c99
参数。
我假设我可以通过在.bashrc文件中创建一个别名来实现这一点,但这似乎很不雅观。您可以调用
c99
,而不是gcc
(如果您的系统上有gcc的包装器),或者尝试修改您的gcc规范文件。更多信息:这里有一个意想不到的答案。使用Makefile
优点:
- 只需键入
即可构建make
- 所有选项都会在生成过程中自动处理。
在进行此操作时,请继续并启用所有警告,这样做很好李> - 易于扩展到多个源文件
- 可以处理涉及不同工具的多步骤构建
- 另一个学习的工具,另一个出错的东西
#include <stdio.h>
int main() {
printf("Hello!\n");
int x = 4;
printf("%d\n", x);
return 0;
}
#包括
int main(){
printf(“你好!\n”);
int x=4;
printf(“%d\n”,x);
返回0;
}
您可以创建这样的Makefile:(免责声明,我实际上不知道如何写)
CC=gcc
CFLAGS=-Wall-pedantic-std=c99
LDFLAGS=
SOURCES=$(通配符*.c)
对象=$(源:.cpp=.o)
可执行文件=你好
.假冒:干净
全部:$(源)$(可执行)
$(可执行文件):$(对象)
$(CC)$(LDFLAGS)$(对象)-o$@
.cpp.o:
$(CC)$(CFLAGS)$<-o$@
清洁:
rm-f*.o$(可执行文件)
它为我建造
同样,如果您删除
-std=c99
,则它不应是有效的C89代码,而且实际上,键入make
会导致生成错误。自定义编译表明您对编译器、标准和基本标志/选项有一定的了解。因此,我建议您在.bashrc
、.tcshrc
等中设置shell变量,并在命令行中使用它们
由于方言的选择会对链接产生影响:CC=“gcc-std=c99”
,因此可以使用$CC-c-O2调用单独的编译命令。。。foo.c
,也是configure
脚本等的默认值。当然,您始终可以使用CC=“gcc-std=c90”或CC=“clang”
覆盖configure
脚本。这同样适用于首选的CFLAGS
值,例如
CFLAGS=“-pipe-W-Wall-O2-march=core2”
允许使用$CC$CFLAGS-c foo.c
命令,默认情况下,这两个环境变量都与配置脚本一起使用,除非您显式重写它们。我认为这比别名更有用。但也许我已经习惯了我自己的设置:)在我看来,两个建议的解决方案几乎都是你想要的,但都没有达到目的
生成文件解决方案
如图所示,通过在Makefile
中定义变量,但不定义目标,可以使用make
命令,就像自定义传递到GCC一样。因此,如果您在“sandbox”目录(或在实际构建系统之外编译的任何地方)中创建一个Makefile
,并定义C*FLAGS
vars,您将基本上得到您想要的。一个示例生成文件:
CFLAGS=-Wall -std=c99
CXXFLAGS=-Wall -std=c++14
现在,makefoo
将foo.c
转换为名为foo
的可执行文件
如果要在多个目录中执行此操作,请将makefile放在已知位置,例如,~/sandbox
,然后在中创建以下别名(或类似别名):
alias usestdmake="ln -s ~/sandbox/Makefile"
CFLAGS="-Wall -std=c99"
CC=gcc
# Use single-ticks to ensure that the variables are evaluated when the alias is evaluated.
alias mycc='$CC $CFLAGS'
然后,您可以在计算机上的任意位置快速编译单个文件:
usestdmake
make foo
这样做的另一个优点是为输出可执行文件提供了一个适当的名称(在本例中为foo
)。它的缺点是禁用compile命令的制表符完成(make fo
不做任何事情,至少在我的系统上是这样)
纯bashrc
解决方案
Brett Hale的回答中提到的CC
/CFLAGS
变量是相当标准的,因此最好在bashrc
中定义它们。然后可以在别名中使用这些变量
在.bashrc
中:
alias usestdmake="ln -s ~/sandbox/Makefile"
CFLAGS="-Wall -std=c99"
CC=gcc
# Use single-ticks to ensure that the variables are evaluated when the alias is evaluated.
alias mycc='$CC $CFLAGS'
在命令行上:
cc foo.c # Compile with default CFLAGS
CFLAGS="$CFLAGS -O2" cc foo.c # Compile with modified CFLAGS
可能的重复-实际上,bashrc
中的别名是解决这类“定制”问题的优雅(标准)解决方案,尽管我不建议您屏蔽名称gcc
——您应该为别名命名其他名称。(例如,ll
通常别名为ls-lA
)c99实际上是所有POSIX平台的先决条件。但请注意,它不一定指向同一版本的gcc。也就是说,在OSX上,c99是一个完全过时的gcc版本。“另一个需要学习的工具,另一个出错的东西……免责声明,我实际上不知道如何编写它们。”无意冒犯,但我认为你用这些陈述严重破坏了你自己的答案。构建系统对于非常重要的项目来说非常重要,但是(1)原始生成是(IMO)构建系统的一个非常糟糕的选择,(2)构建系统对于单文件“沙盒”式编译来说并不是真正必要的或有用的。实际上,事实证明,只需定义CFLAGS
(在生成文件中不做其他事情)这是一个不错的解决方案make
将使用默认参数自动生成目标(我没有意识到这一点)。请看,我已经修复了几个变量赋值,它们需要在Bash中正确处理引号(可能还有大多数或所有其他标准shell)。我认为别名与您建议的变量赋值结合使用是一个很好的解决方案:alias cc=“$cc$CFLAGS”
。