Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Beginner Гость
|
Добавлено: Сб Янв 18 2003 16:37 Заголовок сообщения: Compiler |
|
|
В процессе изучения С поставил ЮНИКС, но при использовании функций стандартной библиотеки, компилятор на строку FILE *fp; сообщает: '*'syntax error fp - undeclared identifier ... То есть FILE как бы не является квалификатором типа. Почему? (строка #include перед этим стоит). Причем, например, функция printf в тех же условиях работает нормально. |
|
Вернуться к началу |
|
|
Dmitry.Karpov http://prof Гость
|
Добавлено: Сб Янв 18 2003 20:41 Заголовок сообщения: Приверь предыдущие строчки |
|
|
Возможно, ты не закрыл какой-то оператор точкой-с-запятой или наоборот, закрыл где не надо. Попробуй убрать звездочку и посмотри на результат. Проверь целостность headers и libraries - может, что-то повреждено (хотя вряд ли). Сделай copy/paste начала программы сюда или выложи ее на WWW и дай сюда ссылку. |
|
Вернуться к началу |
|
|
Beginner Гость
|
Добавлено: Пн Янв 20 2003 15:48 Заголовок сообщения: Вот: |
|
|
После нескольких экспериментов понял, что ошибку вызывает такой вот код:
#include
int main(int argc, char *argv[]) { char c; c = getchar(); FILE *fp; } '*'syntax error fp - undeclared identifier......
Заменив его на:
#include
int main(int argc, char *argv[]) { char c; FILE *fp; c = getchar(); }
получил нормальный результат. Насколько правильно понял - инструкции декларации должны стоять перед всеми остальными инструкциями. Но пара вопросов так и осталась открытыми: В каких случаях нужно подключать библиотеку явно, т.е. с опцией -l? Как узнать в какой библиотеке хранится нужная мне функция? В каком хэдере она объявлена? Прошу прощения за возможно примитивные вопросы,но Юникс у меня всего пару дней, а времени на его изучение нет. |
|
Вернуться к началу |
|
|
Dmitry.Karpov http://prof Гость
|
Добавлено: Пн Янв 20 2003 16:42 Заголовок сообщения: Ну вот, сам догадался! :-) |
|
|
Вот другой вариант: #include <stdio.h> int main(int argc, char *argv[]) { char c = getchar(); FILE *fp; }
Насчет библиотек не знаю: надо читать мануалы, а какие - даже не соображу...
В хедерах объявляются не библиотеки, а функции. Т.е. функции одной библиотеки м.б. объявлены в разных хедерах... |
|
Вернуться к началу |
|
|
Борис Гость
|
Добавлено: Ср Янв 22 2003 19:10 Заголовок сообщения: Еще вариант: переименуй исходные фйлы из *.c в *.cpp или *.cxx. По другим вопросам внутри (+) |
|
|
Нормальный результат получился потому, что у тебя расширение .c, а язык C требует сначала все объявить, затем только использовать. А в языке C++ этого ограничения нет: там объявление может быть в любом месте.
>> В каких случаях нужно подключать библиотеку явно, т.е. с опцией -l? В тех случаях, когда внутри текстов программ нет указания, какие библиотечные файлы использовать, или эти указания невозможно дать, например, если описания (объявления) для разных библиотечных выглядят одинаково, но в зависимости от каких-то условий требуются физически разные файлы. Тогда приходится линковщику через -l сообщать о том, какой конкретно файл использовать. Но это скорее нужно при компиляции для другой платформы, например, компиляция на фри, но для линукс. А для компиляции под свою машину ни к чему.
>>Как узнать в какой библиотеке хранится нужная мне функция? В каком хэдере она объявлена? Для системых функций (fopen, fread, malloc и т. д.) пишешь man имя_функции и узнаешь все, что нужно, или читаешь этот сайт . Для спецбиблиотек читаешь документацию или тщательно изучаешь исходные тексты этих библиотек . Для своих библиотек держишь в голове , а лучше на бумаге.
PS. Вопросы нормальные, но относятся не к юниксу, а к C/C++ |
|
Вернуться к началу |
|
|
Beginner Гость
|
Добавлено: Чт Янв 23 2003 16:06 Заголовок сообщения: Re: Еще вариант: переименуй исходные фйлы из *.c в *.cpp или *.cxx. По другим вопросам внутри (+) |
|
|
Спасибо! Только вот опять вопрос: >>В тех случаях, когда внутри текстов программ нет указания, какие библиотечные файлы использовать...... А разве в текстах вообще даются указания из каких библиотечных ФАЙЛОВ надо брать функцию? |
|
Вернуться к началу |
|
|
Beginner Гость
|
Добавлено: Чт Янв 23 2003 16:32 Заголовок сообщения: Re: Кажется понял! |
|
|
Кажется понял: компилятор ищет во всех библиотеках /usr/lib... и т.д.? |
|
Вернуться к началу |
|
|
|