Заголовочный файл C не будет компилироваться с C, но будет с C ++ - PullRequest
0 голосов
/ 17 мая 2010

У меня есть следующий кусок файла заголовка BKE_mesh.h:

/* Connectivity data */
typedef struct IndexNode {
    struct IndexNode *next, *prev;
    int index;
} IndexNode;
void create_vert_face_map(ListBase **map, IndexNode **mem, const struct MFace *mface,
          const int totvert, const int totface);
void create_vert_edge_map(ListBase **map, IndexNode **mem, const struct MEdge *medge,
          const int totvert, const int totedge);

Обратите внимание, что файл заголовка был подготовлен для возможности использования в файле C ++, как он имел:

#ifdef __cplusplus
extern "C" {
#endif

вверху файла, а требуемый конец внизу. Но класс, реализующий это, был написан на C.

Далее, когда я пытаюсь #include заголовочный файл, я получаю странную ошибку. Если файл имеет расширение .cpp, он просто компилируется, нареканий нет. Тем не менее, если я сделаю:

#include "BKE_mesh.h"

внутри файла с расширением .c я получаю следующие ошибки:

expected ')' before '*' token

для двух последних функций, в частности, переменная:

ListBase **map

в обоих классах. (Обратите внимание, что ранее в заголовочном файле он объявлен, но не определен ListBase).

Итак, мой вопрос: почему этот действительный код C ++, а не код C?

Спасибо.

Ответы [ 2 ]

6 голосов
/ 17 мая 2010

В C ++ вы можете напрямую ссылаться на имена структур, но в C вам нужно добавить ключевое слово struct.

void create_vert_face_map(struct ListBase **map, ... );

Вы можете обойти это, добавив typedef. Тогда вам не придется изменять объявление функции.

typedef struct ListBase ListBase;
0 голосов
/ 17 мая 2010

Попробуйте запустить только препроцессор для каждого случая. Сравнение результата может показать разные заголовочные файлы. Если это так, это может указывать на проблему "C".

...