Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
gcc永久变更c标准_C_Gcc_Standards_C99 - Fatal编程技术网

gcc永久变更c标准

gcc永久变更c标准,c,gcc,standards,c99,C,Gcc,Standards,C99,有没有办法告诉gcc在编译c文件时默认使用c99标准? 我希望避免一直给它-std=c99参数。 我假设我可以通过在.bashrc文件中创建一个别名来实现这一点,但这似乎很不雅观。您可以调用c99,而不是gcc(如果您的系统上有gcc的包装器),或者尝试修改您的gcc规范文件。更多信息:这里有一个意想不到的答案。使用Makefile 优点: 只需键入make即可构建 所有选项都会在生成过程中自动处理。 在进行此操作时,请继续并启用所有警告,这样做很好 易于扩展到多个源文件 可以处理涉及不同工具

有没有办法告诉gcc在编译c文件时默认使用c99标准? 我希望避免一直给它
-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”