В чем разница между следующими двумя объявлениями? Я думал, что они эквивалентны, но первый образец работает, а второй - нет. Я имею в виду, что он компилируется и запускается, но код отображения растрового изображения отображается пустым. Я еще не прошел через это, но я пропущу что-то очевидное? GUI_BITMAP - простая структура, описывающая растровое изображение. Это для VC++ 2005, но я думаю, что он не работает и в VC++ 2008. Царапины моей головы на этом ...Проблема с ключевым словом extern в C++
Пример 1:
extern "C" const GUI_BITMAP bmkeyA_cap_active;
extern "C" const GUI_BITMAP bmkeyA_cap_inactive;
Пример 2:
extern "C"
{
const GUI_BITMAP bmkeyA_cap_active;
const GUI_BITMAP bmkeyA_cap_inactive;
};
Edit: больше исследований показали, что второй пример создания структур, в то время как первый относится к внешним структурам. Второй пример не должен связываться, поскольку в глобальной области с тем же именем есть две переменные. Но это не так, он отправляет нулевую заполненную структуру в отображаемый код, который отдается. Hmmm .....
Редактировать 2: Выполнение того же кода с помощью другого компилятора (IAR) на самом деле не удалось скомпилировать на примере 2 с ошибкой об отсутствии конструктора по умолчанию. Поэтому я предполагаю, что есть что-то тонкое в отношении «extern» ключевого слова, структур и C++, которые я не получаю. Если бы вещи в области внешней деятельности были функциями, то два образца были бы одинаковыми правильно?
Спасибо за ответ, но здесь нет объектов библиотеки, это всего лишь мой код, смесь C и C++. Мой оригинальный вопрос остается - в чем разница между примером 1 и образцом 2 - я думал, что они должны генерировать точно такой же код? Если бы вещи были функциями вместо структур - они одно и то же, не так ли? – Jeff
@ Джефф, быстрый ответ на ваш вопрос в том, что нет, эти два не то же самое, поэтому вы видите проблемы.Во втором случае вы только изменяете утверждения внутри '{}', чтобы использовать соглашения об использовании C. В первом примере вы делаете это * плюс *, указывающее, что переменные объявлены в другом месте. http://msdn.microsoft.com/en-us/library/0603949d(VS.80).aspx –