Принудительное использование предварительных объявлений для кода C ++ на Mac (с использованием Xcode) - PullRequest
3 голосов
/ 14 марта 2012

Это странная проблема, и мне было интересно, видел ли кто-нибудь еще. Мы пишем кроссплатформенный код C ++ для Mac и ПК, и это происходит только на Mac.

Скажем, у меня есть класс, чей файл .h выглядит следующим образом.

class X {
public:
    int _myValue;
    void myFunction();
}

И у меня есть другой класс, чей .h файл выглядит так:

#include "X.h"
class Y {
private:
     X _myObj;
}

Это не скомпилируется. Мы получаем ошибку, указывающую, что X не определен. Решение состоит в том, чтобы добавить предварительное объявление для X в файле Y.h, например: класс X;

Мы занимались этим некоторое время, но сейчас мы попадаем в ситуации, когда это не так хорошо работает. Например, если у нас есть файл .h, у которого есть метод шаблонов, определенный в файле .h, и этот метод ссылается на метод в другом классе, компилятор ничего об этом не знает. Аналогично, если мы ссылаемся на enum, который определен в классе, который был включен, компилятор не распознает его (обходной путь для этой проблемы - поместить enum в отдельный файл .h, и он его отлично подобрал).

Похоже, что при компиляции файла .cpp компилятор не извлекает данные из включенного файла .h.

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

Большое спасибо ...

Ответы [ 3 ]

1 голос
/ 14 марта 2012

Существует общий системный заголовочный файл X.h, который является частью оконного инструментария X11.Я рекомендую изменить имя вашего заголовочного файла, чтобы он не конфликтовал с какими-либо системными заголовками.

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

0 голосов
/ 14 марта 2012

Я просто удивлен, что никто больше не упомянул каноническую схему для включаемых файлов, например,

foo.h:

#ifndef FOO_H
#define FOO_H
// body of the include file
#endif

Я подозреваю, что в данном конкретном случае конфликт "xh" и "Xh" может быть проблемой, которую вы видите, но если вы не защитите включаемые файлы, как это, то будет укусить тебя в конце концов.

Имея этого охранника , вы можете включить «x.h» в любое удобное для вас место.

0 голосов
/ 14 марта 2012

Для вашего первого вопроса (классов) правильный ответ - использовать предварительную декларацию.Вы должны избегать включения файлов проекта в другие файлы проекта.Это может создать циклы включения (что, скорее всего, является вашей проблемой, если бы мне пришлось угадывать).Это также создает чрезмерный отток сборки при изменении заголовка.

Для других ваших проблем (перечисления, шаблоны) это обычно связано с включением циклов.Лучше всего по возможности прерывать эти циклы, избегая включений.

Подробнее об этой проблеме и передовых практиках см. В Рекомендации по использованию файла заголовка для typedefs .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...