Вперед, объявляя typedef безымянной структуры

Возможный дубликат:
Перенаправление объявлений безымянной структуры

Если бы у меня был

typedef struct tagPAGERANGE
{
    int iFirstPage;
    int iLastPage;
} PAGERANGE;

Я могу объявить это так

struct tagPAGERANGE;
typedef struct tagPAGERANGE PAGERANGE;

Но то, что у меня есть

typedef struct
{
    int iFirstPage;
    int iLastPage;
} PAGERANGE;

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


person sashoalm    schedule 20.04.2012    source источник
comment
Не очень похоже на С++. Почему вы пометили его тегом C++?   -  person Griwes    schedule 20.04.2012
comment
Что не так с названием структуры?   -  person N_A    schedule 20.04.2012
comment
C и C++ - разные языки. Вы про какой язык спрашиваете?   -  person Robᵩ    schedule 20.04.2012
comment
@Griwes Проект, из которого он исходит, - это проект C ++. Он компилируется на С++.   -  person sashoalm    schedule 20.04.2012
comment
@mydogisbox Заголовочный файл из библиотеки.   -  person sashoalm    schedule 20.04.2012
comment
@Robᵩ Я удалю любой из двух тегов, просто выберите один. Мой проект — это проект C++, поэтому я удалю тег C.   -  person sashoalm    schedule 20.04.2012
comment
Кто, черт возьми, проголосовал за то, чтобы закрыть вопрос как ненастоящий? Тот факт, что ответ невозможен, не делает его менее достоверным.   -  person R. Martinho Fernandes    schedule 20.04.2012
comment
Да, это реальный вопрос, но это также дуп.   -  person N_A    schedule 20.04.2012
comment
@mydogisbox На самом деле я искал 3-4 минуты, прежде чем задать вопрос, но не смог найти ничего безымянных структур. Может быть, я не использовал лучшие условия поиска. Но я действительно не готов искать 1 час, прежде чем наберусь смелости задать вопрос.   -  person sashoalm    schedule 20.04.2012
comment
@satuon Нет ничего плохого в том, чтобы опубликовать дубликат. Он просто закрывается.   -  person N_A    schedule 20.04.2012
comment
@satuon, я имел в виду, что typedef struct XXX {...} YYY; де-факто C; в C++ вы бы просто сделали struct YYY {}; и покончили с этим. Так что здесь действительно нет места для тега C++.   -  person Griwes    schedule 21.04.2012
comment
вопрос в том, как заставить компилятор С++ принять это. стиль кодирования в сторону.   -  person aepurniet    schedule 08.03.2016


Ответы (2)


Это невозможно. Вы можете объявлять только именованные структуры.

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

person Cat Plus Plus    schedule 20.04.2012
comment
есть обходной путь: stackoverflow.com/a/7304634/347508 - person kritzikratzi; 07.04.2016

Так как это используется в коде C++, просто избавьтесь от typedefs вообще, они ненужны и являются плохим стилем в C++.

Реальное решение состоит в том, чтобы просто использовать именованные структуры:

struct foo; // forward declaration

struct foo {
    // … implementation
};

Определения типов бесполезны.

person Konrad Rudolph    schedule 20.04.2012
comment
Заголовочный файл, в котором используются эти определения типов, не принадлежит мне и предназначен для работы как в C, так и в C++. - person sashoalm; 20.04.2012
comment
@satuon В этом случае см. дублирующийся вопрос. Как сказал кот, это просто невозможно, но другой вопрос показывает (отвратительный) обходной путь. - person Konrad Rudolph; 20.04.2012