Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как узнать определена ли функция 
:(
    Опции темы
HappyLife
Дата 22.7.2008, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 642
Регистрация: 17.5.2006

Репутация: 3
Всего: 8



Как, попросить компилятор узнать определена ли функция или нет?
Компилятор, насколько я понял, это проверяет, лишь в том случае, если в коде функция где-то вызывается. Но как быть с ДЛЛ?
Допустим я пишу
Код

extern "C"
{
IAppModule * __stdcall __declspec(dllexport) CreateAppModule();
}


А определение функции нигде не пишу. Компиляция проходит на ура. Но ошибки конечно возникают когда вызываешь, эту функцию из другой DLL или исполняемого файла.

Так вот, как бы мне повесить проверку, на то есть ли определение или нет. Единственный вариант мне кажется возможным, это вызвать для теста где-нибудь, эту функцию в самой родительской DLL, но рационально ли это?

PM MAIL   Вверх
vinter
Дата 22.7.2008, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата(HappyLife @  22.7.2008,  11:41 Найти цитируемый пост)
Как, попросить компилятор узнать определена ли функция или нет?

на коленях и с цветами в руках smile
а сели серьезно, то это проверяется при линковке и компилятор не участвует в этой проверке, так что проверить можно только попыткой использования.


--------------------
Мой блог
PM MAIL WWW   Вверх
HappyLife
Дата 22.7.2008, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 642
Регистрация: 17.5.2006

Репутация: 3
Всего: 8



Я очень рад. Но разве нет никаких макросов, сказать линковщику это проверить?

PM MAIL   Вверх
SABROG
Дата 22.7.2008, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 4
Всего: 91



Цитата(HappyLife @  22.7.2008,  10:41 Найти цитируемый пост)
extern "C"
{
IAppModule * __stdcall __declspec(dllexport) CreateAppModule();
}


Это прототип, интерфейс, чтобы компилятор мог тебя за рукав дернуть, если ты будеш вызывать функцию с другими типами.

Цитата(HappyLife @  22.7.2008,  17:03 Найти цитируемый пост)
Я очень рад. Но разве нет никаких макросов, сказать линковщику это проверить?


Компилятор создает объектные файлы (.o), которые используются линковщиком. На этапе линковки ты и так узнаеш нашел он адрес нужной функции в одном из модулей или нет, о чем и получишь честно unresolved external. В общем это не задача компилятора делать такую проверку, тем более, что она не всегда может быть выполнена, когда отстуствуют полные исходники других модулей, а есть лишь собранные библиотеки.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
mes
Дата 22.7.2008, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



если речь идет именно о dll , то там позднее связывание функций в режиме рантайма
ни компилятор ни линкер к ьтому отношению не имеет
за случаи ранего связывания отвечает линкер - и если он не найдет подходяшего то обязательно  сообшит ))


--------------------
PM MAIL WWW   Вверх
Peter
Дата 2.8.2008, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 771
Регистрация: 28.7.2003
Где: Ставрополь

Репутация: -1
Всего: 1



Функция GetProcAddress вернет NULL, если в твоей DLL не окажется запрошенной функции.


--------------------
всё, что делаете, делайте от души, как для Господа (Послание апостола Павла колоссянам, 3:23).
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.4706 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.