C++ / CLI: Общественность касательно структуры генерирует C2011: переопределение типа 'класса'

У меня есть заголовочный файл в управляемом проекте DLL как так:

Enums.h:

#pragma once
...
public ref struct ManagedStruct {
    Bitmap^ image;
}
...

На этот заголовок ссылаются и от другого класса в DLL и от отдельного исполняемого файла. Одна только управляемая структура генерирует:

ошибка C2011: 'ManagedStruct': переопределение типа 'класса'.

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

Я проверил, что все необходимые включают и пространства имен И попробовали очевидную защиту заголовка, напрасно; я все еще получаю ошибку.

Большое спасибо за любое понимание!

15
задан Samuel Slade 17 January 2012 в 14:42
поделиться

1 ответ

При работе с управляемым кодом вам придется немного перенастроить традиционное мышление заголовочных файлов C/C++. Основным источником объявлений типов являются метаданные сборки. Это очень отличается от модели компиляции родного C/C++, где вы должны иметь заголовочный файл для типов, которые вы делаете видимыми для других модулей.

Я собираюсь предположить, что вы получаете эту ошибку C2011 в проекте EXE. Где вы и добавили ссылку на сборку проекта DLL (как и положено) и использовали #include в заголовочном файле. Как и не следовало. Это гарантированное дублирующее определение, #pragma once не исправляет это.

Не используйте заголовочные файлы для определений экспортируемых типов. Всегда используйте ссылки на сборку.

33
ответ дан 1 December 2019 в 01:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: