gcc编译无效的C代码

时间:2010-02-08 16:31:09

标签: c++ c gcc

我的一些C程序没有按预期工作。例如,在C中无法通过引用传递,但是当我编写一个使用它并使用gcc编译它的C程序时它工作正常。

gcc是C ++编译器吗?如何让它像C编译器一样?

6 个答案:

答案 0 :(得分:10)

gcc,g ++和其他前端使用文件名来确定语言。例如,gcc和g ++之间唯一的主要区别就是咬了新的C ++程序员:不同的链接设置(对于C ++ stdlib)。

如果您的文件被错误检测到,请使用-x选项(可能是-std)明确指定。或者遵循gcc用于文件名的通用命名约定。对于C,这意味着* .c。

仔细检查您是否使用大写/大写* .C来命名文件;那被检测为C ++。

答案 1 :(得分: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 ++文件。

答案 2 :(得分:5)

程序gcc是一个驱动程序,它可以根据安装的内容和文件的扩展名分派给C,C ++,Ada,Fortran,Java和其他编译器。

如果明智地选择了这些,那么你不应该做任何事情来将C文件编译为编译为C ++的C和C ++文件。要强制编译为C,请在编译文件之前使用-x c作为选项

我的猜测是你用大写的C而不是小写的C命名你的文件,大写的C被认为是C ++。

答案 3 :(得分:4)

尝试定义命令行选项-pedantic,并指定您希望遵守的C标准,例如: C99为--std=c99,C89为--std=c89;这应该使它拒绝任何不属于指定标准的东西。

编辑:请注意-ansi可以代表C89或C ++ 98,并且可能无法强制编译器进入“C模式”。

答案 4 :(得分: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

您将获得与gcc + test.cpp相同的结果,这意味着编译为C ++。

cc是C前端cc1plus是C ++前端。就是这样。

答案 5 :(得分:0)

g++应该是C ++的前端和cc的C,但都指向gcc。

如果要编译符合标准的C代码,请使用gcc -ansi