首先,是否可以編輯GCC命令行設置,以便我不必每次都用-std = c99標誌進行編譯?能否將GCC中的std = c99設置爲默認值?
其次,爲什麼c99不是默認行爲?使用c99編譯允許某些現代編程約定,例如在for循環中創建和初始化索引變量。
for(int i = 0; i < 10; i++) {...
沒有c99標誌,這是不可能的,我將不得不在外部自己的行,我認爲是愚蠢的。爲什麼GCC默認只編譯C99? (合法好奇,不抱怨,請不要抨擊)
謝謝。
首先,是否可以編輯GCC命令行設置,以便我不必每次都用-std = c99標誌進行編譯?能否將GCC中的std = c99設置爲默認值?
其次,爲什麼c99不是默認行爲?使用c99編譯允許某些現代編程約定,例如在for循環中創建和初始化索引變量。
for(int i = 0; i < 10; i++) {...
沒有c99標誌,這是不可能的,我將不得不在外部自己的行,我認爲是愚蠢的。爲什麼GCC默認只編譯C99? (合法好奇,不抱怨,請不要抨擊)
謝謝。
我不知道這個答案,但你應該只使用一個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,但如果您最終得到具有主函數的多個文件,則會發生抱怨。
好方法是使用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。
您可以添加到您的~/.profile
或類似的平臺上:
CFLAGS="$CFLAGS -std=c99"
然後作出和類似的工具應該每次把它撿起來。
至於爲什麼它不是默認值:向後兼容!
如果你真的希望每次添加-std=c99
,您可以修改所謂的「規範文件」,這是爲gcc
命令配置文件。請注意,gcc
命令實際上是一個編譯器驅動程序,它只調用狹義編譯器(對於GCC工具鏈,後者爲ccl
或cc1plus
)。)
現在修改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
做同樣的事,這對你的目的來說更重要。
我想你可以做'別名gcc =「gcc -std = c99」'。 – 2014-10-28 02:03:43
技術上[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
@remyabel:是的,每當下一個版本出來時,他們都會更新這個崇高的目標。 – Deduplicator 2014-10-28 02:08:36