2013-12-04 2 views
2
#include <sys/syscall.h> 
#define BUFSIZE 1024 

main() 
{ 
    char buf[BUFSIZE]; 
    int n; 
    while((n=read(0,buf,BUFSIZE))>0) 
     write(1,buf,n); 
    return 0; 
} 

Когда я скомпилирую это с помощью gcc, все в порядке. Но использование г ++ я получил:Gcc и g ++ different on write()

inandout.c:7:32: error: ‘read’ was not declared in this scope 
    while((n=read(0,buf,BUFSIZE))>0) 
           ^
inandout.c:8:22: error: ‘write’ was not declared in this scope 
     write(1,buf,n); 
        ^

Почему?

+0

читать и писать в unistd.h, вам повезло на C, или есть какой-то угол, я знаю. – Guido

+4

Попробуйте '#include ' – smac89

+2

Потому что C и C++ - разные языки .... Это не единственные вещи, на которые должен жаловаться g ++ (подсказка: всегда компилируйте с помощью '-pedantic'). –

ответ

5

Это потому, что GCC является C компилятор, г ++ является C++ компилятор, и C and C++ are different languages.

Если вы хотите компилировать этот исходный код как программу на C++, вы должны изменить его, чтобы стать C++. Например, в C++ нет неявных деклараций функций, поэтому вы должны указать unistd.h для read() и write() объявлений. Вам также не нужен заголовок syscall.h.

Кроме того, это просто так просто, потому что у вас есть простой фрагмент кода. Портирование кода C на C++ может быть кошмаром, так как существует ~ 50 различий, а в некоторых случаях код хорошо компилируется в обоих случаях, но ведет себя по-разному.

P.S .: И вместо определения странно BUFSIZE себя, рассмотреть вопрос об использовании стандарта BUFSIZ :)

1

Функции по умолчанию, которые не имеют прототипа функции, возвращающей int, но для этого вам необходимо получить предупреждения (использовали ли вы -Wall?).

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

+1

Можно также вбрасывать в' -Wextra'. –

0

Вам просто нужно добавить include <unistd.h>

0

я повышен до GCC 4.8.5. В версии 4.7 компилятор остановился, включая unistd.h, в ряде файлов include. Вот почему старые версии компилятора gcc работали без включения unistd.h.

https://gcc.gnu.org/gcc-4.7/porting_to.html «язык C++ выдает зависимости заголовка изменяет Многие из стандартной библиотеки C++ включает в себя файлы были отредактированы, чтобы больше не включать в unistd.h для удаления загрязнения пространства имен.»

В моем случае я получил :: write не был объявлен, когда я включил stdio.h, но моя предыдущая версия gcc версии 4.4 скомпилирована. Это полезная команда, чтобы увидеть, какие пути просматриваются препроцессором: g ++ -H test.cpp