Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Предварительная декларация типа (структуры), Си 99 
V
    Опции темы
Alca
Дата 18.5.2011, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 7
Всего: 50



Си 99, gcc.real (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2

Есть такая структрура:
Код

//код Си
typedef struct {
    //...
} SConfig;


Можно ли в СИ сделать предварительную декларацию типа (структуры)?
Что-то вроде:
Код

struct SConfig;


Это сообщение отредактировал(а) Alca - 18.5.2011, 17:54


--------------------
PM WWW ICQ Skype Jabber   Вверх
Фантом
Дата 18.5.2011, 18:00 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


Профиль
Группа: Участник Клуба
Сообщений: 1516
Регистрация: 23.3.2008

Репутация: нет
Всего: 49



Можно. Но зачем?
PM   Вверх
Alca
Дата 18.5.2011, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 7
Всего: 50



Цитата

Но зачем?

Разгребаю чужой код

Добавлено @ 18:12
Код

/*****************************************************************************************************
    File:   log.h

******************************************************************************************************/

#ifndef Trader_LogH
#define Trader_LogH
//----------------------------------------------------------------------------------------------------
#include "Common.h"
#include "crypt.h"
//----------------------------------------------------------------------------------------------------
struct SConfig;

typedef enum {
    lmNothing          = - 1,
    lmFile             = 0,
    lmFileStdout       = 1,
    lmFileStderr       = 2,
    lmFileStdoutStdErr = 4
} ELogMode;
//----------------------------------------------------------------------------------------------------
int bLogWrite    (const char *pcszRootDir, const char *pcszLogFilePath, const ELogMode clmMode, const int cbErrnoFlag, const int ciLastError, const int ciSourceLine, const char *pcszFormat, ...);
int bLogTruncate (const char *pcszFilePath, const size_t cuiMaxLines, const size_t cuiMaxWeight);

//pid
int bPidLogWrite (const pid_t ciPid, const SConfig &ccfConfig, const char *pcszPidFilePath, const ELogMode clmLogMode, const char *pcszLogFilePath);
int bPidLogDelete(                   const SConfig &ccfConfig, const char *pcszPidFilePath, const ELogMode clmLogMode, const char *pcszLogFilePath);
//----------------------------------------------------------------------------------------------------
#endif //Trader_LogH



Код

/*****************************************************************************************************
    File:   crypt.h

******************************************************************************************************/

#ifndef Trader_CryptH
#define Trader_CryptH
//----------------------------------------------------------------------------------------------------
#include "Common.h"
//----------------------------------------------------------------------------------------------------
//SConfig
    typedef struct {
        char   szRootPath   [MAX_STR_SIZE];
        char   szDomain     [MAX_STR_SIZE];
        double dPercent;
        char   szRedirectUrl[MAX_STR_SIZE];
        char   szVersion    [9 + 1];
    } SConfig;

    #if xTEMP_DISABLED 
        //с такой структурой все компилится, с помощью g++
        struct SConfig {
            char   szRootPath   [MAX_STR_SIZE];
            char   szDomain     [MAX_STR_SIZE];
            double dPercent;
            char   szRedirectUrl[MAX_STR_SIZE];
            char   szVersion    [9 + 1];
        };
    #endif

int  bSConfig_Init (SConfig *pcfConfig, const char *pcszPattern);
//----------------------------------------------------------------------------------------------------
#endif  //Trader_CryptH


Код

Description    Resource    Path    Location
expected ‘;’, ‘,’ or ‘)’ before ‘&’ token    log.h    /C    line 30
expected ‘;’, ‘,’ or ‘)’ before ‘&’ token    log.h    /C    line 31
expected ‘;’, ‘,’ or ‘)’ before ‘&’ token    util.h    /C    line 55
make: *** [cron.o] Error 1    C         
implicit declaration of function ‘bPidLogDelete’    cron.c    /C    line 6543
implicit declaration of function ‘bPidLogWrite’    cron.c    /C    line 68
implicit declaration of function ‘bSSettings_Load’    cron.c    /C    line 82


Добавлено @ 18:16
Т.е. тип не виден

Это сообщение отредактировал(а) Alca - 18.5.2011, 18:20


--------------------
PM WWW ICQ Skype Jabber   Вверх
mes
Дата 18.5.2011, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Alca @  18.5.2011,  17:05 Найти цитируемый пост)
 typedef struct 

для typedefa нельзя напрямую сделать forward declaration.. 



--------------------
PM MAIL WWW   Вверх
Alca
Дата 18.5.2011, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 7
Всего: 50



Как можно?


--------------------
PM WWW ICQ Skype Jabber   Вверх
mes
Дата 18.5.2011, 19:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Alca @  18.5.2011,  17:56 Найти цитируемый пост)
Как можно? 

Код

typedef struct SStruct  TStruct;

TStruct * p;

struct SStruct {
  int a;
};


int main ()
{

   TStruct test;
   p = &test;
     
}


http://liveworkspace.org/code/da66b5ed7319...d9dc2ad718c3b22



--------------------
PM MAIL WWW   Вверх
Alca
Дата 19.5.2011, 09:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 7
Всего: 50



Спасибо


--------------------
PM WWW ICQ Skype Jabber   Вверх
xvr
Дата 19.5.2011, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Еще можно так 
Код

typedef struct SConfig {
 ...
} SConfig;
Должно работать и в С и в С++ (и со оригинальными С исходниками)



PM MAIL   Вверх
borisbn
Дата 19.5.2011, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



mes, спасибо огромное ! А то из-за какой-то плёвой структурки приходилось в h-никах инклюдать неподъёмный windows.h...
теперь всё гораздо проще:
Код

// h-ник
typedef struct _SYSTEMTIME SYSTEMTIME;
void foo( SYSTEMTIME * p );

// cpp-шник
#include <windows.h>

void foo( SYSTEMTIME * st ) {
    ...
}



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
borisbn
Дата 19.5.2011, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



ууууупс. а как быть с unnamed стуктурами ?
Пример из IPP
Код

typedef struct {
    Ipp16s  re;
    Ipp16s  im;
} Ipp16sc;

вот не хочу я их h-ник включать в свой, а мне нужно объявить ф-цию
Код

void foo( const Ipp16sc * p );

как тогда быть ?


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
xvr
Дата 19.5.2011, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(borisbn @  19.5.2011,  14:46 Найти цитируемый пост)
ууууупс. а как быть с unnamed стуктурами ?

Для С++ это полная зад#$%^  smile Если сможешь победить (без переписывания Сных .h файлов) - поделись с общественностью  smile 

PM MAIL   Вверх
mes
Дата 19.5.2011, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(borisbn @  19.5.2011,  13:46 Найти цитируемый пост)
как тогда быть ? 

анонимную структуру нельзя объявить, а только определить, следовательно получается, что никак.. 


--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0583 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.