2010-02-08 4 views
3

일부 C 프로그램이 예상대로 작동하지 않습니다. 예를 들어, 참조에 의한 전달은 C에서 가능하지 않지만,이를 사용하는 C 프로그램을 작성하고 gcc로 컴파일하면 잘 동작합니다.gcc가 잘못된 C 코드를 컴파일합니다.

gcc는 C++ 컴파일러입니까? 어떻게하면 C 컴파일러처럼 동작합니까?

+11

일부 코드를 게시하지 않고도 (PBR)을 말할 수는 없습니다! – Joe

+2

Joe와 동의합니다 : 코드와 파일 이름을 게시해야합니다. 소스 파일의 확장자가 .cpp, .cc, .C 또는 .C++ (및 다른 일부) 인 경우 C++로 컴파일합니다. gcc (또는 g ++)로 .c 파일을 컴파일하는 경우, 참조에 의한 호출은 * 컴파일되지 않습니다 *. 또한 gcc가 C++ 라이브러리를 기본적으로 연결하지 않기 때문에 gcc와 C++ 객체를 연결하려고 시도하면 gcc가 성공적으로 연결되지 않습니다. –

+0

@Joe : PBR이란 무엇입니까? –

답변

4

명령 줄 옵션 -pedantic을 정의하고 준수 할 C 표준을 지정하십시오. C99에 대한 --std=c99, C89에 대한 --std=c89; 이것은 지정된 표준의 일부가 아닌 것을 거부하도록해야합니다.

편집 : -ansi은 C89 또는 C++ 98을 나타낼 수 있으며 컴파일러가 강제로 "C 모드"로 작동하지 않을 수 있습니다.

+1

C++ 소스를 C로 컴파일하면 ... – UncleBens

+0

실제로 파일이 C++ 소스라고 생각하면 --std = c89와 같은 플래그가 무시됩니다. 그러나 그렇게하고 있다고 경고합니다. –

+0

사실, 파일에 이미 .cpp 확장자가있는 경우 C 표준을 지정하면 경고가 발생합니다. 그런 다음 다시 시도해 보면 뭔가 다른 것이 깨진 징후입니다. =) – Arkku

7

나는이 컴파일 경우와

int f(int & r) { 
    return r + 1; 
} 

int main() { 
    int x = 3; 
    return f(x); 
} 

:

gcc e.c 

내가 얻을 :

e.c:1: error: expected ';', ',' or ')' before '&' token 

당신은 아마 당신이 .CPP 확장을 컴파일하는 파일을 주어진 적이 있습니까? 가지고 있다면, gcc 드라이버는 그것을 C++ 파일로 컴파일 할 것입니다.

10

gcc, g ++ 및 다른 프론트 엔드는 언어를 결정하기 위해 파일 이름을 사용합니다. 예를 들어, gcc와 g ++의 가장 큰 차이점은 새로운 C++ 프로그래머를 물들이는 것입니다 : C++ stdlib에 대한 다른 링크 설정.

파일을 잘못 검색 한 경우 명시 적으로 지정하려면 -x 옵션을 사용하십시오 (그리고 아마도 -std). 또는 은 gcc가 파일 이름에 사용하는 일반적인 이름 지정 규칙을 따릅니다. C의 경우 * .c를 의미합니다.

대문자/* .C를 사용하여 파일 이름을 확인하지 마십시오. 그것은 C++로 탐지됩니다.

0

g++은 C++의 프런트 엔드 여야하고, 모두 cc (C의 경우 둘다 gcc를 가리킴)이어야합니다.

당신은 표준 준수 C 코드를 컴파일 프로그램 GCC는 C, C++, 에이다, 포트란, 자바와에 따라 아마 다른 컴파일러에 파견 할 수있는 드라이버입니다 gcc -ansi

+0

-1 :'-ansi'는 C 또는 C++ 모드인지 여부에 따라 C90 또는 C++ 98을 지정합니다. '-std' 옵션은 훨씬 더 명백합니다. – greyfade

5

사용하려면 설치된 내용과 파일의 확장자.

현명하게 선택하면 C 및 C++ 파일을 C++로 컴파일 된 C 파일을 컴파일 할 필요가 없습니다. C로 컴파일하려면 강제로 컴파일 된 파일 전에 옵션으로 -x c을 사용하십시오.

내 생각에 파일 이름을 소문자 대신 대문자 C로하고 대문자 C를 C++로 간주합니다.

2

gcc이 드라이버입니다. 파일 확장자에 따라 실제로 다른 프론트 엔드를 호출하거나 강제로 -x를 호출합니다.

그러나 g++의 경우 기본적으로 소스 파일을 C++로 처리하므로 파일이 (* .c) (소문자) 일 수도 있습니다.========

echo "int main() { } " > test.c 

gcc -v -c test.c 

[제발하지 실제 프런트 엔드 컴파일러 인 /usr/libexec/gcc/i386-redhat-linux/4.1.2/cc1plus 선.을] :

왜 자신을 편의적인 간단한 시험을하지 ================

Using built-in specs. 
Target: i386-redhat-linux 
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-libgcj-multifile --enable-languages=c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk --disable-dssi --enable-plugin --with-java-home=/usr/lib/jvm/java-1.4.2-gcj-1.4.2.0/jre --with-cpu=generic --host=i386-redhat-linux 
Thread model: posix 
gcc version 4.1.2 20080704 (Red Hat 4.1.2-46) 
/usr/libexec/gcc/i386-redhat-linux/4.1.2/cc1 -quiet -v test.c -quiet -dumpbase test.c -mtune=generic -auxbase test -version -o /tmp/ccUiF4Qr.s 
ignoring nonexistent directory "/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../i386-redhat-linux/include" 
#include "..." search starts here: 
#include <...> search starts here: 
/usr/local/include 
/usr/lib/gcc/i386-redhat-linux/4.1.2/include 
/usr/include 
End of search list. 
GNU C version 4.1.2 20080704 (Red Hat 4.1.2-46) (i386-redhat-linux) 
    compiled by GNU C version 4.1.2 20080704 (Red Hat 4.1.2-46). 
GGC heuristics: --param ggc-min-expand=59 --param ggc-min-heapsize=55455 
Compiler executable checksum: 435964263b657ac05d988fae7b6714b1 
as -V -Qy -o test.o /tmp/ccUiF4Qr.s 
GNU assembler version 2.17.50.0.6-12.el5 (i386-redhat-linux) using BFD version 2.17.50.0.6-12.el5 20061020 

=========================== ==

mv test.c test.cpp 
gcc -v -c test.cpp 

=============================

Using built-in specs. 
Target: i386-redhat-linux 
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-libgcj-multifile --enable-languages=c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk --disable-dssi --enable-plugin --with-java-home=/usr/lib/jvm/java-1.4.2-gcj-1.4.2.0/jre --with-cpu=generic --host=i386-redhat-linux 
Thread model: posix 
gcc version 4.1.2 20080704 (Red Hat 4.1.2-46) 
/usr/libexec/gcc/i386-redhat-linux/4.1.2/cc1plus -quiet -v -D_GNU_SOURCE test.cpp -quiet -dumpbase test.cpp -mtune=generic -auxbase test -version -o /tmp/ccUgae0u.s 
ignoring nonexistent directory "/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../i386-redhat-linux/include" 
#include "..." search starts here: 
#include <...> search starts here: 
/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include/c++/4.1.2 
/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include/c++/4.1.2/i386-redhat-linux 
/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include/c++/4.1.2/backward 
/usr/local/include 
/usr/lib/gcc/i386-redhat-linux/4.1.2/include 
/usr/include 
End of search list. 
GNU C++ version 4.1.2 20080704 (Red Hat 4.1.2-46) (i386-redhat-linux) 
    compiled by GNU C version 4.1.2 20080704 (Red Hat 4.1.2-46). 
GGC heuristics: --param ggc-min-expand=59 --param ggc-min-heapsize=55455 
Compiler executable checksum: 2c84476b74368e297382b43d14e53b01 
as -V -Qy -o test.o /tmp/ccUgae0u.s 
GNU assembler version 2.17.50.0.6-12.el5 (i386-redhat-linux) using BFD version 2.17.50.0.6-12.el5 20061020 

=========== =====================

mv test.cpp test.c 
g++ -v -c test.c 

당신은 C++로 컴파일 의미 gcc + test.cpp, 같은 결과를 얻을 수 있습니다.

cc은 C 프런트 엔드 cc1plus은 C++ 프런트 엔드입니다. 그게 전부 야.

관련 문제