2014-10-28 4 views
1

첫째, 매번 -std = c99 플래그로 컴파일 할 필요가 없도록 GCC 명령 행 설정을 편집 할 수 있습니까?GCC에서 std = c99를 기본값으로 설정할 수 있습니까?

둘째, 왜 c99가 기본 동작이 아닌가요? c99로 컴파일하면 for 루프에서 인덱스 변수를 만들고 초기화하는 것과 같은 특정 프로그래밍 규칙을 사용할 수 있습니다. C99 플래그없이

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

이 가능하지 않을 것입니다 그리고 난 내가 바보라고 생각 한 줄에 외부 적으로 선언해야합니다. 왜 GCC는 기본적으로 C99로 컴파일되지 않습니까? (합법적 인 호기심, 불평하지 마시오. 부끄러움이 없어야 함)

고마워.

+6

별칭 gcc = "gcc -std = c99"'를 사용한다고 가정합니다. –

+1

기술적으로 [C99 지원] (https://gcc.gnu.org/c99status.html)이 완전하지 않습니다. [표준 페이지] (https://gcc.gnu.org/onlinedocs/gcc/Standards.html#Standards)는 다음과 같이 말합니다.'C 언어 언어 옵션이 제공되지 않는 경우 기본값은 -std = gnu90입니다. 이것은 향후 릴리스에서 -std = gnu11로 변경하려고합니다. ' –

+0

@remyabel : 예, 다음 개정판이 나올 때마다 그 고귀한 목표를 업데이트 할 것입니다. – Deduplicator

답변

4

나는 이것에 대한 답을 모르지만, 당신은 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) 

유형의 메이크업은, 컴파일 컴파일 된 개체를 제거하는 청소 확인합니다. # 기호를 사용하여 주석을 제거하고 SO 탭에서 INSERT TAB을 추가합니다.

실제로 OBJECTS 및 TODELETE에서 * .c 및 * .o를 제거 할 필요는 없지만 주 기능이있는 파일이 두 개 이상인 경우 불평 할 것입니다.

1

좋은 방법은 answered by Christopher Schneider과 같은 Makefile을 사용하는 것입니다. this example을 참조하십시오.

또한 심지어 gcc 이름 (/usr/bin하기 전에, 당신의 $PATH에) 쉘 스크립트를 가질 수있다 (당신의 $PATH/usr/bin/ 전에 를 넣어 즉 ​​$HOME/bin/gcc$HOME/bin으로 참조하여 ~/.bashrc를) 원하는 옵션을 /usr/bin/gcc를 호출 . 대화식 사용의 경우 gcc 명령을 사용할 수도 있습니다.

결국, GCCspec-files을 사용하고 있습니다. 시스템의 사양 파일을 변경하여 특정 옵션을 추가 할 수 있습니다 (cc1). 나는 그것이 좋은 생각인지 모른다.

GCC의 다음 버전 (기본값)은 C11입니다.

1

당신은 당신의 플랫폼에서 ~/.profile 또는 유사한 당신이를 추가 할 수 있습니다

CFLAGS="$CFLAGS -std=c99" 

그런 다음 확인과 비슷한 도구가 때마다 그것을 선택해야합니다.

기본값이 아닌 이유는 이전 버전과의 호환성입니다.

8

당신은 정말이 -std=c99마다 시간을 추가 할 경우, gcc 명령에 대한 설정 파일 인 이른바 '스펙 파일 "을 수정할 수 있습니다. gcc 명령은 실제로 좁은 의미의 컴파일러 만 호출하는 컴파일러 드라이버입니다 (후자는 GCC 툴체인의 경우 ccl 또는 cc1plus입니다).)

사양 파일은 기본적으로 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) 

gcc 명령이이 방법으로 어떤 스펙 파일을 찾으려고 시도하는 경로를 찾아 다음 내장 사양 파일을 덤핑에 의해 위의 위치 중 하나에서 템플릿 파일을 만듭니다

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

, gcc -v로부터의 출력이

$ gcc -v 
Using built-in specs. 
(...snip...) 
으로부터 변경해야 뭔가 617,451,515,

같은
$ 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=c99gcc 명령은 프리 프로세서 cpp의 전체 명령 행을 구성하기 전에으로 확장되는 곳입니다. -std 옵션의 고유 한 기본값으로 작동하도록 바로 앞에 -std=c99을 삽입 할 수 있어야합니다. 실제로 더 중요한 목적을 위해 *cc1_options에 대해 동일하게 수행하십시오.

관련 문제