일부 C 프로그램이 예상대로 작동하지 않습니다. 예를 들어, 참조에 의한 전달은 C에서 가능하지 않지만,이를 사용하는 C 프로그램을 작성하고 gcc로 컴파일하면 잘 동작합니다.gcc가 잘못된 C 코드를 컴파일합니다.
gcc는 C++ 컴파일러입니까? 어떻게하면 C 컴파일러처럼 동작합니까?
일부 C 프로그램이 예상대로 작동하지 않습니다. 예를 들어, 참조에 의한 전달은 C에서 가능하지 않지만,이를 사용하는 C 프로그램을 작성하고 gcc로 컴파일하면 잘 동작합니다.gcc가 잘못된 C 코드를 컴파일합니다.
gcc는 C++ 컴파일러입니까? 어떻게하면 C 컴파일러처럼 동작합니까?
명령 줄 옵션 -pedantic
을 정의하고 준수 할 C 표준을 지정하십시오. C99에 대한 --std=c99
, C89에 대한 --std=c89
; 이것은 지정된 표준의 일부가 아닌 것을 거부하도록해야합니다.
편집 : -ansi
은 C89 또는 C++ 98을 나타낼 수 있으며 컴파일러가 강제로 "C 모드"로 작동하지 않을 수 있습니다.
나는이 컴파일 경우와
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++ 파일로 컴파일 할 것입니다.
gcc, g ++ 및 다른 프론트 엔드는 언어를 결정하기 위해 파일 이름을 사용합니다. 예를 들어, gcc와 g ++의 가장 큰 차이점은 새로운 C++ 프로그래머를 물들이는 것입니다 : C++ stdlib에 대한 다른 링크 설정.
파일을 잘못 검색 한 경우 명시 적으로 지정하려면 -x 옵션을 사용하십시오 (그리고 아마도 -std). 또는 은 gcc가 파일 이름에 사용하는 일반적인 이름 지정 규칙을 따릅니다. C의 경우 * .c를 의미합니다.
대문자/* .C를 사용하여 파일 이름을 확인하지 마십시오. 그것은 C++로 탐지됩니다.
g++
은 C++의 프런트 엔드 여야하고, 모두 cc
(C의 경우 둘다 gcc를 가리킴)이어야합니다.
당신은 표준 준수 C 코드를 컴파일 프로그램 GCC는 C, C++, 에이다, 포트란, 자바와에 따라 아마 다른 컴파일러에 파견 할 수있는 드라이버입니다 gcc -ansi
-1 :'-ansi'는 C 또는 C++ 모드인지 여부에 따라 C90 또는 C++ 98을 지정합니다. '-std' 옵션은 훨씬 더 명백합니다. – greyfade
사용하려면 설치된 내용과 파일의 확장자.
현명하게 선택하면 C 및 C++ 파일을 C++로 컴파일 된 C 파일을 컴파일 할 필요가 없습니다. C로 컴파일하려면 강제로 컴파일 된 파일 전에 옵션으로 -x c
을 사용하십시오.
내 생각에 파일 이름을 소문자 대신 대문자 C로하고 대문자 C를 C++로 간주합니다.
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++ 프런트 엔드입니다. 그게 전부 야.
일부 코드를 게시하지 않고도 (PBR)을 말할 수는 없습니다! – Joe
Joe와 동의합니다 : 코드와 파일 이름을 게시해야합니다. 소스 파일의 확장자가 .cpp, .cc, .C 또는 .C++ (및 다른 일부) 인 경우 C++로 컴파일합니다. gcc (또는 g ++)로 .c 파일을 컴파일하는 경우, 참조에 의한 호출은 * 컴파일되지 않습니다 *. 또한 gcc가 C++ 라이브러리를 기본적으로 연결하지 않기 때문에 gcc와 C++ 객체를 연결하려고 시도하면 gcc가 성공적으로 연결되지 않습니다. –
@Joe : PBR이란 무엇입니까? –