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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с линковкой 
:(
    Опции темы
Proger89
Дата 19.8.2008, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Доброго времени суток.
В процесе написания проекта, я создал файл содержаший константы. В данный файл входит массив указателей на функции:
Код

/*
Файл CmdList.h
*/
#ifndef CMD_LIST_H
#define CMD_LIST_H

#include "BuildInCmds.h"

// Другие константы

typedef void (*CommandFunc)(LPWSTR *ppWordArray, int nWordsNum, LPWSTR pNewCommand);

CommandFunc CmdsFuncs[NUM_OF_COMMANDS] = {NULL,
                            ExecPwd,
                            NULL
                                   };


#endif



Файл BuildInCmds.h - содержит интерфейсы функций для массива, CmdsFuncs.
BuildInCmds.h:
Код

#include <windows.h>

#ifndef BUILD_IN_CMDS_H
#define BUILD_IN_CMDS_H

void ExecPwd(LPWSTR *ppWordArray, int nWordsNum, LPWSTR pNewCommand);

#endif


Когда я пытаюсь добавить CmdList.h (#include "CmdList.h") в другой файл, то во время линковки возникает ошибка:
unresolved external symbol "void __cdecl ExecPwd(wchar_t * *,int,wchar_t *)" (?ExecPwd@@YAXPAPA_WHPA_W@Z)

Подскажите пожалуста, с чем это может быть связано? Как решить эту проблему?

Спасибо за внимание.
PM   Вверх
marcusmae
Дата 19.8.2008, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


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

Репутация: 5
Всего: 39



Proger89, компилятор указывает на необходимость определения символа ExecPwd, поскольку он описан, но не определен. То есть функция void ExecPwd(LPWSTR *ppWordArray, int nWordsNum, LPWSTR pNewCommand); должна иметь тело.


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
Proger89
Дата 19.8.2008, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Решение найдено! Перезапустил студию и проблема исчезла  smile 

Это сообщение отредактировал(а) Proger89 - 19.8.2008, 19:21
PM   Вверх
MAKCim
Дата 19.8.2008, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Proger89, 
вообще говоря определения должны быть в *.c/*.cpp файлах


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

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


Шустрый
*


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

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



Цитата(MAKCim @ 19.8.2008,  19:28)
Proger89, 
вообще говоря определения должны быть в *.c/*.cpp файлах

Простите. Но где вы видете определение (реализацию) функций в .h/.hpp файлах?
PM   Вверх
MAKCim
Дата 19.8.2008, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Proger89, 
а где я говорил про функции?
я говорил про определения
в данном случае определением является CmdsFuncs


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

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


Шустрый
*


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

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



Цитата(MAKCim @ 19.8.2008,  22:53)
Proger89, 
а где я говорил про функции?
я говорил про определения
в данном случае определением является CmdsFuncs

Но что в этом плохого? Зачем выносить определение контант в cpp файл?
PM   Вверх
MAKCim
Дата 20.8.2008, 10:25 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(Proger89 @  20.8.2008,  09:43 Найти цитируемый пост)
Но что в этом плохого? Зачем выносить определение контант в cpp файл? 

1. не определение констант, а определение неконстанты
2. адрес ExecPwd в рамках определения не является константой во время компиляции
правильно так
Код

#ifndef CMD_LIST_H
#define CMD_LIST_H

#include "BuildInCmds.h"

// Другие константы

typedef void (*CommandFunc)(LPWSTR *ppWordArray, int nWordsNum, LPWSTR pNewCommand);

extern CommandFunc CmdsFuncs[NUM_OF_COMMANDS];

#endif

Код

/*
CmdList.cpp
*/

CommandFunc CmdsFuncs[NUM_OF_COMMANDS] = {NULL,
                            ExecPwd,
                            NULL
                                   };

иначе при включении CmdList.h в более чем 2 модуля и использовании CmdsFuncs в них будет ошибка сборки


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Alek86
Дата 20.8.2008, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 21
Всего: 25



Цитата(MAKCim @  20.8.2008,  10:25 Найти цитируемый пост)
не определение констант, а определение неконстанты

разве при определении констант такой ошибки не должно быть?


--------------------
user posted image    user posted image
PM MAIL   Вверх
MAKCim
Дата 20.8.2008, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(Alek86 @  20.8.2008,  12:20 Найти цитируемый пост)
разве при определении констант такой ошибки не должно быть? 

для POD-констант нет


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Alek86
Дата 20.8.2008, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 21
Всего: 25



Цитата(MAKCim @  20.8.2008,  12:32 Найти цитируемый пост)
для POD-констант нет

интересно, как оно реализовано?
компилятор, если видит, что определяется ПОД константа, просто не выделяет для нее память, а оставляет это на совести линковщика?


--------------------
user posted image    user posted image
PM MAIL   Вверх
MAKCim
Дата 20.8.2008, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(Alek86 @  20.8.2008,  12:44 Найти цитируемый пост)
интересно, как оно реализовано?

1. значение константы подставляется на этапе компиляции
2. константа представляет собой локальный символ, не видимый за пределами модуля (для сохранения семантики const_cast<TYPE&>(VARIABLE) = ...)


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Alek86
Дата 20.8.2008, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 21
Всего: 25



ясно, спасибо


--------------------
user posted image    user posted image
PM MAIL   Вверх
UnrealMan
Дата 20.8.2008, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 27
Всего: 32



Цитата(MAKCim @  19.8.2008,  20:28 Найти цитируемый пост)
вообще говоря определения должны быть в *.c/*.cpp файлах 

Цитата(Proger89 @  19.8.2008,  20:51 Найти цитируемый пост)
Простите. Но где вы видете определение (реализацию) функций в .h/.hpp файлах?

Цитата(MAKCim @  19.8.2008,  23:53 Найти цитируемый пост)
а где я говорил про функции?
я говорил про определения

smile smile smile
Ты забыл уточнить, какое именно определение имеется в виду.

Цитата(MAKCim @  20.8.2008,  11:25 Найти цитируемый пост)
2. адрес ExecPwd в рамках определения не является константой во время компиляции

Адрес функции может быть использован как константное выражение:

Цитата(С++03 - 5.19 Constant expressions)
An address constant expression is a pointer to an lvalue designating an object of static storage duration, a string literal (2.13.4), or a function. The pointer shall be created explicitly, using the unary & operator, or implicitly using a non-type template parameter of pointer type, or using an expression of array (4.2) or function (4.3) type.

Цитата(С99 - 6.6 Constant expressions)
An address constant is a null pointer, a pointer to an lvalue designating an object of static storage duration, or a pointer to a function designator; it shall be created explicitly using the unary & operator or an integer constant cast to pointer type, or implicitly by the use of an expression of array or function type.

Этого вполне достаточно для осуществления статической инициализации.

Цитата(Alek86 @  20.8.2008,  13:20 Найти цитируемый пост)
разве при определении констант такой ошибки не должно быть? 

Не должно, т.к. любой глобальный константный объект, объявленный как const и не объявленный как extern, имеет внутреннее связывание. Т.е. в заголовочном файле инициализация

Код

const CommandFunc CmdsFuncs[NUM_OF_COMMANDS] = {NULL,
                            &ExecPwd,
                            NULL
                                   };

вполне законна.

Это сообщение отредактировал(а) UnrealMan - 20.8.2008, 14:08
PM MAIL   Вверх
Proger89
Дата 20.8.2008, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Спасибо всем за обсуждение.
Но, что такое POD-константы? Google не помог мне в этом.
PM   Вверх
UnrealMan
Дата 20.8.2008, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 27
Всего: 32



Цитата(Proger89 @  20.8.2008,  18:33 Найти цитируемый пост)
Но, что такое POD-константы? Google не помог мне в этом. 

Это потому что нет такого понятия smile 
PM MAIL   Вверх
bsa
Дата 20.8.2008, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(Proger89 @ 20.8.2008,  17:33)
Но, что такое POD-константы? Google не помог мне в этом.

Бывают POD типы (plain old data). Это стандартные типы (int, short, long, char, double, float, void * и пр) + структуры, объединения (union) и классы, которые только их и содержат.
Более подробно написано тут: http://www.fnal.gov/docs/working-groups/fp...xx/doc/POD.html

Под POD константой понимается константная переменная POD типа (например const int var;).
PM   Вверх
MAKCim
Дата 20.8.2008, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(UnrealMan @  20.8.2008,  19:25 Найти цитируемый пост)
Это потому что нет такого понятия 

а я откуда его знаю?  smile 

bsa, 
угу


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
UnrealMan
Дата 20.8.2008, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 27
Всего: 32



Цитата(bsa @  20.8.2008,  21:25 Найти цитируемый пост)
Более подробно написано тут: http://www.fnal.gov/docs/working-groups/fp...xx/doc/POD.html

В топку такое старьё. Уже почти пять лет действующим стандартом является ISO/IEC 14882:2003(E).
PM MAIL   Вверх
bsa
Дата 21.8.2008, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(UnrealMan @ 20.8.2008,  22:55)
В топку такое старьё. Уже почти пять лет действующим стандартом является ISO/IEC 14882:2003(E).

Ну так выложи ссылку, где подробно написано по интересующей теме с учетом этого стандарта. Я просто первое что попалось в поиске, то и привел.
PM   Вверх
UnrealMan
Дата 21.8.2008, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 27
Всего: 32



К POD-типам относятся:
  • встроенные арифметические типы (bool, char, signed char, unsigned char, wchar_t, short int, unsigned short int, int, unsigned int, long int, unsigned long int, float, double, long double)
  • указатели и указатели на члены
  • массивы объектов POD-типов
  • const-, volatile- и const volatile-квалифицированные версии POD-типов
  • перечисления (типы, объявленные с помощью ключевого слова enum)
  • POD-классы, т.е. классы, которые удовлетворяют следующим требованиям:
    • не содержат пользовательских конструкторов, деструктора или копирующего оператора присваивания
    • не содержат закрытых или защищённых нестатических членов-данных
    • не имеют базовых классов
    • не содержат виртуальных функций
    • не содержат нестатических членов-данных, имеющих тип, отличный от POD-типа
    • не содержат нестатических членов-ссылок
Все остальные типы не являются POD-типами.
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0631 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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