gcc компилирует неверный код C - PullRequest
3 голосов
/ 08 февраля 2010

Некоторые из моих программ на C не работают должным образом. Например, передача по ссылке невозможна в C, но когда я пишу программу на C, которая использует ее и компилирует с помощью gcc, она работает нормально.

Является ли gcc компилятором C ++? Как мне заставить его вести себя как компилятор C?

Ответы [ 6 ]

10 голосов
/ 08 февраля 2010

gcc, g ++ и другие интерфейсы используют имена файлов для определения языка. Например, единственное основное различие между gcc и g ++ - это то, что кусает новых программистов на C ++: разные настройки ссылок (для stdlib в C ++).

Используйте опцию -x (и, возможно, -std), чтобы явно указать, если ваши файлы будут обнаружены неправильно. Или следуйте общим соглашениям об именах, которые gcc использует для имен файлов . Для C это означает * .c.

Дважды проверьте, что вы не использовали заглавные / прописные буквы * .C для именования вашего файла; это определяется как C ++.

7 голосов
/ 08 февраля 2010

Если я скомпилирую это:

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 ++.

5 голосов
/ 08 февраля 2010

Программа gcc - это драйвер, который может отправлять в C, C ++, Ada, Fortran, Java и, возможно, другие компиляторы в зависимости от того, что установлено и расширение файла.

Если они выбраны мудро, вам не нужно ничего делать, чтобы файлы C компилировались как файлы C и C ++, скомпилированные как C ++. Чтобы принудительно скомпилировать как C, используйте -x c в качестве опции перед скомпилированным файлом.

Я предполагаю, что вы назвали свой файл заглавными буквами C вместо строчных, а заглавная C считается C ++.

4 голосов
/ 08 февраля 2010

Попробуйте определить параметр командной строки -pedantic и укажите стандарт C, которому вы хотите соответствовать, например, --std=c99 для C99, --std=c89 для C89; это должно заставить его отклонить все, что не является частью указанного стандарта.

Редактировать: обратите внимание, что -ansi может обозначать либо C89, либо C ++ 98, и может не работать, чтобы заставить компилятор перейти в «C-режим».

2 голосов
/ 13 июня 2010

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 ++. Вот и все.

0 голосов
/ 08 февраля 2010

g++ должен быть внешним интерфейсом для C ++ и cc для C, но оба указывают на gcc.

Если вы хотите скомпилировать стандартный совместимый код C, используйте gcc -ansi

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...