| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Проблема с линковкой |
| Автор: Proger89 19.8.2008, 18:12 | ||||
| Доброго времени суток. В процесе написания проекта, я создал файл содержаший константы. В данный файл входит массив указателей на функции:
Файл BuildInCmds.h - содержит интерфейсы функций для массива, CmdsFuncs. BuildInCmds.h:
Когда я пытаюсь добавить CmdList.h (#include "CmdList.h") в другой файл, то во время линковки возникает ошибка: unresolved external symbol "void __cdecl ExecPwd(wchar_t * *,int,wchar_t *)" (?ExecPwd@@YAXPAPA_WHPA_W@Z) Подскажите пожалуста, с чем это может быть связано? Как решить эту проблему? Спасибо за внимание. |
| Автор: marcusmae 19.8.2008, 18:42 |
| Proger89, компилятор указывает на необходимость определения символа ExecPwd, поскольку он описан, но не определен. То есть функция void ExecPwd(LPWSTR *ppWordArray, int nWordsNum, LPWSTR pNewCommand); должна иметь тело. |
| Автор: Proger89 19.8.2008, 19:21 |
| Решение найдено! Перезапустил студию и проблема исчезла |
| Автор: MAKCim 19.8.2008, 19:28 |
| Proger89, вообще говоря определения должны быть в *.c/*.cpp файлах |
| Автор: Proger89 19.8.2008, 19:51 | ||
Простите. Но где вы видете определение (реализацию) функций в .h/.hpp файлах? |
| Автор: MAKCim 19.8.2008, 22:53 |
| Proger89, а где я говорил про функции? я говорил про определения в данном случае определением является CmdsFuncs |
| Автор: Proger89 20.8.2008, 09:43 | ||
Но что в этом плохого? Зачем выносить определение контант в cpp файл? |
| Автор: Alek86 20.8.2008, 12:20 |
разве при определении констант такой ошибки не должно быть? |
| Автор: MAKCim 20.8.2008, 12:32 |
для POD-констант нет |
| Автор: Alek86 20.8.2008, 12:44 |
интересно, как оно реализовано? компилятор, если видит, что определяется ПОД константа, просто не выделяет для нее память, а оставляет это на совести линковщика? |
| Автор: MAKCim 20.8.2008, 12:46 |
1. значение константы подставляется на этапе компиляции 2. константа представляет собой локальный символ, не видимый за пределами модуля (для сохранения семантики const_cast<TYPE&>(VARIABLE) = ...) |
| Автор: Alek86 20.8.2008, 12:56 |
| ясно, спасибо |
| Автор: UnrealMan 20.8.2008, 13:38 | ||||||||||
Ты забыл уточнить, какое именно определение имеется в виду.
Адрес функции может быть использован как константное выражение:
Этого вполне достаточно для осуществления статической инициализации. Не должно, т.к. любой глобальный константный объект, объявленный как const и не объявленный как extern, имеет внутреннее связывание. Т.е. в заголовочном файле инициализация
вполне законна. |
| Автор: Proger89 20.8.2008, 17:33 |
| Спасибо всем за обсуждение. Но, что такое POD-константы? Google не помог мне в этом. |
| Автор: UnrealMan 20.8.2008, 19:25 |
Это потому что нет такого понятия |
| Автор: bsa 20.8.2008, 20:25 | ||
Бывают POD типы (plain old data). Это стандартные типы (int, short, long, char, double, float, void * и пр) + структуры, объединения (union) и классы, которые только их и содержат. Более подробно написано тут: http://www.fnal.gov/docs/working-groups/fpcltf/Pkg/ISOcxx/doc/POD.html Под POD константой понимается константная переменная POD типа (например const int var;). |
| Автор: MAKCim 20.8.2008, 21:33 |
а я откуда его знаю? bsa, угу |
| Автор: UnrealMan 20.8.2008, 22:55 | ||
В топку такое старьё. Уже почти пять лет действующим стандартом является ISO/IEC 14882:2003(E). |
| Автор: bsa 21.8.2008, 13:18 | ||
Ну так выложи ссылку, где подробно написано по интересующей теме с учетом этого стандарта. Я просто первое что попалось в поиске, то и привел. |
| Автор: UnrealMan 21.8.2008, 15:29 |
К POD-типам относятся:
|