2014-10-28 1059 views
1

首先,是否可以編輯GCC命令行設置,以便我不必每次都用-std = c99標誌進行編譯?能否將GCC中的std = c99設置爲默認值?

其次,爲什麼c99不是默認行爲?使用c99編譯允許某些現代編程約定,例如在for循環中創建和初始化索引變量。

for(int i = 0; i < 10; i++) {... 

沒有c99標誌,這是不可能的,我將不得不在外部自己的行,我認爲是愚蠢的。爲什麼GCC默認只編譯C99? (合法好奇,不抱怨,請不要抨擊)

謝謝。

+6

我想你可以做'別名gcc =「gcc -std = c99」'。 – 2014-10-28 02:03:43

+1

技術上[C99支持](https://gcc.gnu.org/c99status.html)不完整。 [標準頁面](https://gcc.gnu.org/onlinedocs/gcc/Standards.html#Standards)說:'如果沒有給出C語言方言選項,默認是-std = gnu90;這是爲了在未來的某個版本中更改爲-std = gnu11。' – 2014-10-28 02:04:44

+0

@remyabel:是的,每當下一個版本出來時,他們都會更新這個崇高的目標。 – Deduplicator 2014-10-28 02:08:36

回答

4

我不知道這個答案,但你應該只使用一個makefile。

很簡單的makefile:

CC = gcc 
CFLAGS = -g -Wall -std=c99 
OBJECTS = *.c #Source files 
NAME = FILENAME #Desired filename 
TODELETE = $(NAME) *.o # the *.o should be the same as the objects 
LIBS = NECESSARY_LIBS #remove line if no external libraries needed 

mt-collatz : $(OBJECTS) 
<INSERT TAB>$(CC) $(CFLAGS) $(OBJECTS) -o $(NAME) $(LIBS) 

.PHONY: clean 
clean: 
<INSERT TAB>rm -f $(TODELETE) 

輸入make來編譯,使清潔去除編譯的對象。使用#號刪除註釋,並在其中添加一個選項卡,它說INSERT TAB,因爲我不知道如何在SO上執行此操作。

實際上,您不必刪除OBJECTS和TODELETE中的* .c和* .o,但如果您最終得到具有主函數的多個文件,則會發生抱怨。

1

好方法是使用Makefile,如answered by Christopher Schneider。另請參閱this example

你也可以有一個shell腳本(在你的$PATH/usr/bin前),甚至可能命名爲gcc(即$HOME/bin/gcc$HOME/bin$PATH/usr/bin/之前,請參閱~/.bashrc),它需要的選項調用/usr/bin/gcc 。對於交互式使用,您還可以使用alias命令gcc

最後,GCC正在使用spec-files。您可以更改系統的spec文件以添加特定的選項(對於cc1)。我不確定這是個好主意。

GCC的下一個版本(5.0)將默認爲C11

1

您可以添加到您的~/.profile或類似的平臺上:

CFLAGS="$CFLAGS -std=c99" 

然後作出和類似的工具應該每次把它撿起來。

至於爲什麼它不是默認值:向後兼容!

8

如果你真的希望每次添加-std=c99,您可以修改所謂的「規範文件」,這是爲gcc命令配置文件。請注意,gcc命令實際上是一個編譯器驅動程序,它只調用狹義編譯器(對於GCC工具鏈,後者爲cclcc1plus)。)

現在修改specs文件有點棘手,因爲它默認只存在於gcc命令的二進制文件中。這是因爲很少有人想爲了自己的目的而修改它。

尋找在該gcc命令試圖找到這樣任何規範文件的路徑,

$ strace -e file gcc 2>&1 | grep specs 
access("/usr/lib/gcc/x86_64-linux-gnu/4.6/specs", R_OK) = -1 ENOENT (No such file or directory) 
access("/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../x86_64-linux-gnu/lib/x86_64-linux-gnu/4.6/specs", R_OK) = -1 ENOENT (No such file or directory) 
access("/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../x86_64-linux-gnu/lib/specs", R_OK) = -1 ENOENT (No such file or directory) 
access("/usr/lib/gcc/x86_64-linux-gnu/specs", R_OK) = -1 ENOENT (No such file or directory) 

,然後在上面的位置之一傾倒內置的規範文件中創建一個模板文件:

$ sudo bash -c 'gcc -dumpspecs > /path/to/specs' 

在這一點上,從gcc -v輸出應該從這個

$ gcc -v 
Using built-in specs. 
(...snip...) 
更改

爲類似

$ gcc -v 
Reading specs from /usr/lib/gcc/x86_64-linux-gnu/4.6/specs 
(...snip...) 

現在,您需要修改的規範文件根據您的需要。語法確實很神祕,但你可以使用你的想象力。提示:你應該看到類似

*cpp_options: 
%(cpp_unique_options) %1 %{m*} %{std*&ansi&trigraphs} %{W*&pedantic*} %{w} %{f*} %{g*:%{!g0:%{g*} %{!fno-working-directory:-fworking-directory}}} %{O*} %{undef} %{save-temps*:-fpch-preprocess} %(ssp_default) 

看這個部分:

%{std*&ansi&trigraphs} 

這是-std=c99擴展成gcc命令構建了預處理cpp完整的命令行之前。您應該能夠在它之前插入-std=c99,以便它可以作爲-std選項的默認值。爲*cc1_options做同樣的事,這對你的目的來說更重要。