nixp.ru v3.0

16 января 2017,
понедельник,
20:29:17 MSK

Аутсорсинг Linux с компанией «Флант»
decvar написал 30 октября 2003 года в 20:50 (547 просмотров) Ведет себя как мужчина; открыл 111 тему в форуме, оставил 1838 комментариев на сайте.

test.c

——————————

#include

int main()

{

printf(«Hallo, world»);

return 0;

}

—————————-

decvar@earth:~> gcc test.c

test.c:1:22: iostream.h: No such file or directory

fly4life

Бывает и не такое ;)

Может у тебя и вправду нет такого файла ;)

decvar

Такого НЕ может не быть. Это описание I/O. printf, cout, cin etc.

fly4life

Да лана, не кипятись =). Стебусь я..

Как-то ты свой test.c неправильно компилишь… Может всё-таки g++ ? ;)

blacklion

для printf надо stdio.h

decvar

да в курсе я, что нада stdio.h

но iostream.h нет. Вот и вопрос КАК?

а gcc умеет сам подставлять g++, java и еще че-нить

decvar

Просто не понятно тогда как делать cout >> или cin <<

blacklion

slocate iostream.h

и смотреть почему не находит его

fly4life

2 decvar: мало ли что там и куда умеет подставлять gcc ;). Нужно явно указать g++. Ты попробуй хоть.

2 blacklion. кстати, для printf хоть и нужно stdio.h, но это не обязательно указывать вообще для этого оператора…

blacklion

разве? насколько меня убедила литература printf — это функция которая находиться «гдето» и обязана быть описана в соответсвующем хидере.

fly4life

Ничего умного по этому поводу сказать не могу ;)… Просто попробуй =)

blacklion

а че тут пробовать? =) без хидера это будет вызов неопределенной функции

fly4life
blacklion
а че тут пробовать? =) без хидера это будет вызов неопределенной функции

Удалились от темы, ну и фиг с ним =)

Скомпилируй этот код:

main()

{

printf(«Hello, World!\n»);

return 0;

}

Тебе даже ворнингов никаких не выдаст на консоль ;)

blacklion

на этапе компиляции не спорю, возможно промолчит, так как посчитает что ф-ция внешняя, а вот линковка навряд ли удастся

fly4life

Ладно.. Если ты не хочешь по хорошему ;)))

Тогда скомпилируй и слинкуй =)

Ну попробуй же, наконец…

blacklion

да вот вчера под вечер писал фильтр, и начал с printf(«…»), без инклудников

gcc -o foofilter foofilter.cpp

выдало что и ожидалось:

foofilter.cpp: In function `int main ()’:

foofilter.cpp:5: `printf' undeclared (first use this function)

foofilter.cpp:5: (Each undeclared identifier is reported only once for each

function it appears in.)

утром перечитал твой пост, подумал возможно дело в cpp?

mv foofilter.cpp foofilter.с, скомпиллировалось =(

век живи век учись =)

чем это объясняется?

fly4life
blacklion
чем это объясняется?

Вот как объяснили:

«Если быть кратким, то поскольку в командной строке ты явно не указываешь язык, то gcc (который расшифровывается как GNU Compiler Collection, а не GNU C/C++ Compiler, между прочим) сам его определяет — в твоем случае по расширению. Соответственно твой код воспринимается анализатором C++, а не C (в конце концов, не от балды же ты сделал расширение cpp ;) ). Я сейчас не могу сходу сказать, почему пропускается printf, но не исключаю, что этот символ по умолчанию определен и при попытке линка с умолчальными же библиотеками (=glibc для Linux) находится и прекрасно подставляется. C++ — более строгий язык и вольности с недоопределенными символами там недопустимы.»

(c) Ktirf

fly4life

Вот ещё привели (конкретно, дал vaborg) ссылку на документ, частично объясняющий это:

http://gazette.linux.ru.net/lg84/kim.html

blacklion

про различное поведение в зависимости от расширения для меня как раз не новость. новость то что он что то «по дефолту» подключает, что есть имхо не правильно (наверное историческая особенность) так как любой дефолт может обернуться злом. опять же непонятно как и в каком случае он будет решать о дефолтном подключении хедеров.

anonymous

Ну вы даете, понятно что gcc определяет язык по расширению. Если расширение cpp, то хидер требуецца, т.к. стандарт С++ это оговаривает. А вот по стандарту С совсем не обязательно иметь прототип функции для ее вызова. Это связано с отсутствием полиморфизма у С. Другими словами, в С может быть только одна функция с данным именем, а в С++ несколько.

myst
blacklion
про различное поведение в зависимости от расширения для меня как раз не новость. новость то что он что то «по дефолту» подключает, что есть имхо не правильно (наверное историческая особенность) так как любой дефолт может обернуться злом. опять же непонятно как и в каком случае он будет решать о дефолтном подключении хедеров.

хидеры по дефолту никто не подключает. gcc по дефолту линкует твою прогу с libc. если б он этого не делал тебе пришлось бы каждый раз писать ключик -lc, что есть лишний гимор. а так как декларации printf нет, то по стандарту ISO это эквивалентно:

printf ()

что есть — функция printf, возвращающая int и имеющая любое кол-во параметров (проверка параметров этой функции отлючается).

вот и всё. просто как апельсин.

Anarchist
myst
gcc по дефолту линкует твою прогу с libc

Да?

А не с glibc?..

myst
Anarchist
Да?

А не с glibc?..

а не один хер??! чего к словам придираешься? может мне ещё предложения с заглавной буквы начинать?

Anarchist
myst
а не один хер??! чего к словам придираешься? может мне ещё предложения с заглавной буквы начинать?

Далеко не один.

Обязательно.

myst
Anarchist
Далеко не один.

Обязательно.

Тьфу ты? Почему всё обязательно надо разжёвывать?! Под словом «libc» понималась СТАНДАРТНАЯ БИБЛИОТЕКА ЯЗЫКА СИ. Такая как описана в «ISO/IEC 9899:1999 Programming Languages — C». Напрмер у меня под виндой MinGW (это который — порт GCC под винду) линкует с msvcrt.dll, следовательно ни о какой glibc и речи не идёт. Т.е. в этом конкретном случае под libc понималась любая её реализация. ПОЭТОМУ, ЧТО LIBC, ЧТО GLIBC — ОДИН ХЕР! И нечего тут спорить.

ecobeingecobeing.ru
Экология и вегетарианство на благо всем живым существам Планеты.