Использование struct / typedef в стиле C из C ++ - PullRequest
7 голосов
/ 13 июля 2011

У меня есть проект, который смешивает C и C ++. В заголовочном файле C у меня есть такой код:

typedef struct mystruct* mystruct;
struct mystruct {
    // whatever struct needs
};

И чтобы использовать это в файле C ++, я делаю:

extern "C" {
#include "mystruct.h"
}

Итак, вы видите, что я создаю непрозрачный указатель с теми же именами. Это хорошо в C, но не в C ++ (из-за необходимости создания экземпляра с использованием ключевого слова struct в C, но не в C ++). Тем не менее, я получаю сообщение об ошибке (конфликтующие объявления) при попытке компилировать код C ++. Я думал, что использование extern "C" заставит компилятор обрабатывать заголовок C как C, но, похоже, он все еще использует его как C ++. Есть ли объяснение тому, что здесь происходит?

Ответы [ 2 ]

11 голосов
/ 13 июля 2011

Я думал, что использование extern "C" заставит компилятор обрабатывать заголовок C как C

No.Единственное, что делает extern "C" - это управление именами.Код все еще скомпилирован как C ++ (хотя вещи, которые требуют искаженных имен, таких как пространства имен или шаблоны, не будут работать).В частности, правило, касающееся идентификаторов struct, по-прежнему применяется.

1 голос
/ 13 июля 2011

extern "C" обеспечивает связь C, в отличие от искаженной связи C ++. extern "C" не обеспечивает полное соответствие C, например, динамически изменяемые массивы и т. д.

...