decvar
написал 30 октября 2003 года в 20:50 (1317 просмотров)
Ведет себя
как мужчина; открыл 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
Последние комментарии
- OlegL, 17 декабря в 15:00 → Перекличка 21
- REDkiy, 8 июня 2023 года в 9:09 → Как «замокать» файл для юниттеста в Python? 2
- fhunter, 29 ноября 2022 года в 2:09 → Проблема с NO_PUBKEY: как получить GPG-ключ и добавить его в базу apt? 6
- Иванн, 9 апреля 2022 года в 8:31 → Ассоциация РАСПО провела первое учредительное собрание 1
- Kiri11.ADV1, 7 марта 2021 года в 12:01 → Логи catalina.out в TomCat 9 в формате JSON 1
ecobeing.ru
Экология и вегетарианство на благо всем живым существам Планеты.
Бывает и не такое ;)
Может у тебя и вправду нет такого файла ;)
Такого НЕ может не быть. Это описание I/O. printf, cout, cin etc.
Да лана, не кипятись =). Стебусь я..
Как-то ты свой test.c неправильно компилишь… Может всё-таки g++ ? ;)
для printf надо stdio.h
да в курсе я, что нада stdio.h
но iostream.h нет. Вот и вопрос КАК?
а gcc умеет сам подставлять g++, java и еще че-нить
Просто не понятно тогда как делать cout >> или cin <<
slocate iostream.h
и смотреть почему не находит его
2 decvar: мало ли что там и куда умеет подставлять gcc ;). Нужно явно указать g++. Ты попробуй хоть.
2 blacklion. кстати, для printf хоть и нужно stdio.h, но это не обязательно указывать вообще для этого оператора…
разве? насколько меня убедила литература printf — это функция которая находиться «гдето» и обязана быть описана в соответсвующем хидере.
Ничего умного по этому поводу сказать не могу ;)… Просто попробуй =)
а че тут пробовать? =) без хидера это будет вызов неопределенной функции
Удалились от темы, ну и фиг с ним =)
Скомпилируй этот код:
main()
{
printf(«Hello, World!\n»);
return 0;
}
Тебе даже ворнингов никаких не выдаст на консоль ;)
на этапе компиляции не спорю, возможно промолчит, так как посчитает что ф-ция внешняя, а вот линковка навряд ли удастся
Ладно.. Если ты не хочешь по хорошему ;)))
Тогда скомпилируй и слинкуй =)
Ну попробуй же, наконец…
да вот вчера под вечер писал фильтр, и начал с 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.с, скомпиллировалось =(
век живи век учись =)
чем это объясняется?
Вот как объяснили:
«Если быть кратким, то поскольку в командной строке ты явно не указываешь язык, то gcc (который расшифровывается как GNU Compiler Collection, а не GNU C/C++ Compiler, между прочим) сам его определяет — в твоем случае по расширению. Соответственно твой код воспринимается анализатором C++, а не C (в конце концов, не от балды же ты сделал расширение cpp ;) ). Я сейчас не могу сходу сказать, почему пропускается printf, но не исключаю, что этот символ по умолчанию определен и при попытке линка с умолчальными же библиотеками (=glibc для Linux) находится и прекрасно подставляется. C++ — более строгий язык и вольности с недоопределенными символами там недопустимы.»
(c) Ktirf
Вот ещё привели (конкретно, дал vaborg) ссылку на документ, частично объясняющий это:
http://gazette.linux.ru.net/lg84/kim.html
про различное поведение в зависимости от расширения для меня как раз не новость. новость то что он что то «по дефолту» подключает, что есть имхо не правильно (наверное историческая особенность) так как любой дефолт может обернуться злом. опять же непонятно как и в каком случае он будет решать о дефолтном подключении хедеров.
Ну вы даете, понятно что gcc определяет язык по расширению. Если расширение cpp, то хидер требуецца, т.к. стандарт С++ это оговаривает. А вот по стандарту С совсем не обязательно иметь прототип функции для ее вызова. Это связано с отсутствием полиморфизма у С. Другими словами, в С может быть только одна функция с данным именем, а в С++ несколько.
хидеры по дефолту никто не подключает. gcc по дефолту линкует твою прогу с libc. если б он этого не делал тебе пришлось бы каждый раз писать ключик -lc, что есть лишний гимор. а так как декларации printf нет, то по стандарту ISO это эквивалентно:
что есть — функция printf, возвращающая int и имеющая любое кол-во параметров (проверка параметров этой функции отлючается).
вот и всё. просто как апельсин.
Да?
А не с glibc?..
а не один хер??! чего к словам придираешься? может мне ещё предложения с заглавной буквы начинать?
Далеко не один.
Обязательно.
Тьфу ты? Почему всё обязательно надо разжёвывать?! Под словом «libc» понималась СТАНДАРТНАЯ БИБЛИОТЕКА ЯЗЫКА СИ. Такая как описана в «ISO/IEC 9899:1999 Programming Languages — C». Напрмер у меня под виндой MinGW (это который — порт GCC под винду) линкует с msvcrt.dll, следовательно ни о какой glibc и речи не идёт. Т.е. в этом конкретном случае под libc понималась любая её реализация. ПОЭТОМУ, ЧТО LIBC, ЧТО GLIBC — ОДИН ХЕР! И нечего тут спорить.