Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Си вариант идиомы pimpl


Автор: boostcoder 27.1.2011, 02:22
всем привет.
в с++, реализацию скрываю так:
Код

struct implementation {
   ...
   ...

   struct pimpl;
   boost::shared_ptr<pimpl> impl;
};

все как обычно.

в Си пробую так:
Код

// декларация
struct implementation {
   struct pimpl;
   struct pimpl* impl;
};

// реализация
struct implementation::pimpl {
};

получаю такое:
Цитата

error: expected identifier or ‘(’ before ‘:’ token

походу, в Си так нельзя.


как подобное, обычно реализуется в Си ?

спасибо.

Автор: mes 27.1.2011, 02:33
нету в С ни неймспейсов, ни вложенных (nested) классов..

Добавлено через 3 минуты и 7 секунд
Цитата(boostcoder @  27.1.2011,  01:22 Найти цитируемый пост)
как подобное, обычно реализуется в Си ?

задайте длинное имя и опишите структуру снаружи.. smile

Автор: boostcoder 27.1.2011, 02:38
оказывается можно так:
Код

// декларация в .h фале
struct implementation {
   struct pimpl;
   struct pimpl* impl;
};

// реализация в .c файле
struct pimpl {
};


вполне устраивает smile


всем спасибо.

Автор: mes 27.1.2011, 02:44
Цитата(boostcoder @  27.1.2011,  01:38 Найти цитируемый пост)
// декларация в .h фале
struct implementation {
   struct pimpl;
   struct pimpl* impl;
};
// реализация в .c файле
struct pimpl {
};


может лучше подойдет более простой вариант

Код

// декларация в .h фале
struct pimpl;
void f1(struct pimpl*);
 
// реализация в .c файле
struct pimpl {
};
void f1(struct pimpl*)


Автор: boostcoder 27.1.2011, 02:49
Цитата(mes @  27.1.2011,  02:44 Найти цитируемый пост)
может лучше подойдет более простой вариант

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

Добавлено через 50 секунд
т.е. имена самим pimpl`ам

Автор: bsa 27.1.2011, 13:25
boostcoder, в Си совсем не требуется PIMPL, так как там нет классов как таковых. Т.е. ты объявляешь структуру и ряд функций для работы с указателем на нее. Определение структуры и реализацию функций делай уже в приватных исходниках.
mystruct.h
Код
struct MyStruct;
typedef struct MyStruct MyStruct;
int func1(MyStruct *ms);
int func2(MyStruct *ms);
mystruct.c
Код
struct MyStruct
{
/* ... */
};

int func1(MyStruct *ms)
{
}

int func2(MyStruct *ms)
{
}

Автор: xvr 27.1.2011, 13:26
Цитата(boostcoder @  27.1.2011,  02:49 Найти цитируемый пост)
хидеров несколько, соответственно, и структур pimpl несколько. придумывать им имена, зная, что пользователю все равно с ними не работать - не логично.

А придется, в С запись
Код

// декларация в .h фале
struct implementation {
   struct pimpl;
   struct pimpl* impl;
};
// реализация в .c файле
struct pimpl {
};
и запись
Код

// декларация в .h фале
struct pimpl;
struct implementation {
   struct pimpl* impl;
};
// реализация в .c файле
struct pimpl {
};
полностью идентичны. Так что будут массовые struct pimpl из разных .h файлов

Автор: boostcoder 27.1.2011, 13:56
Цитата(xvr @  27.1.2011,  13:26 Найти цитируемый пост)
А придется

да, кстати, напоролся.
Си немного вводит в ступор, после продолжительного НЕписания на нем smile 

Цитата(xvr @  27.1.2011,  13:26 Найти цитируемый пост)
и запись
// декларация в .h фале
struct pimpl;
struct implementation {
   struct pimpl* impl;
};
// реализация в .c файле
struct pimpl {
};
полностью идентичны.

не знал smile 

Автор: mes 27.1.2011, 15:09
Цитата(boostcoder @  27.1.2011,  12:56 Найти цитируемый пост)
не знал 

ну так в первом же посте было: 
Цитата(mes @  27.1.2011,  01:33 Найти цитируемый пост)
нету в С ни неймспейсов, ни вложенных (nested) классов..

Цитата(mes @  27.1.2011,  01:33 Найти цитируемый пост)
задайте длинное имя и опишите структуру снаружи..

 smile

Добавлено @ 15:11
и еще, как уже не раз заметили, Вы не с той стороны подошли к Пимпл в С.. там подобное решается несколько другим образом.. 
и мышление в С++ стиле будет только мешать.. 

Автор: boostcoder 27.1.2011, 15:14
Цитата(mes @  27.1.2011,  15:09 Найти цитируемый пост)
ну так в первом же посте было

про неймспейсы я понял, а вот про вложенные структуры как-то пропустил.. :(

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)