Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Как узнать определена ли функция


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

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


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

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

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

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

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

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


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

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


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

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)