Forward declarations in C?
От: Аноним  
Дата: 18.10.09 21:34
Оценка:
Простой вопрос. Есть ли forward declarations в Си 89-го и 99-х годов как в Плюсах?
Re: Forward declarations in C?
От: Кодт Россия  
Дата: 18.10.09 21:41
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Простой вопрос. Есть ли forward declarations в Си 89-го и 99-х годов как в Плюсах?

Да, есть.
Перекуём баги на фичи!
Re: Forward declarations in C?
От: rg45 СССР  
Дата: 19.10.09 05:18
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Простой вопрос. Есть ли forward declarations в Си 89-го и 99-х годов как в Плюсах?


Что касается функций — да, то же самое. А вот с объявлениями структур есть небольшая особенность:
typedef struct Foo Foo;
void foo(Foo*);

Все дело в том, что имя структуры в C не является автоматически именем типа, как в C++.
--
Re[2]: Forward declarations in C?
От: Lorenzo_LAMAS  
Дата: 19.10.09 12:12
Оценка: 6 (1)
R>Что касается функций — да, то же самое.

ну, не совсем. например в С и С++ следующее объявление означает совсем разные вещи:

void fun(struct A * p);
Of course, the code must be complete enough to compile and link.
Re[3]: Forward declarations in C?
От: Lorenzo_LAMAS  
Дата: 19.10.09 12:15
Оценка:
вот более полный пример:

//C
void fun(struct A * p)
{
}

struct A{int i_;};

int main()
{
   struct A a;
   fun(&a);//Error!!!
}

//C++
void fun(struct A * p)
{
}

struct A{int i_;};

int main()
{
   struct A a;
   fun(&a);//Ok!!!
}
Of course, the code must be complete enough to compile and link.
Re[3]: Forward declarations in C?
От: Кодт Россия  
Дата: 19.10.09 15:24
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

R>>Что касается функций — да, то же самое.


L_L>ну, не совсем. например в С и С++ следующее объявление означает совсем разные вещи:


Не совсем разные вещи, просто С++ здесь нахаляву ещё и предобъявление сделает.
А в Си нужно предобъявление ручками
struct TagA; // предобъявление в чистом виде
typedef struct TagB AliasB, *PointerB; // предобъявление и typedef
struct TagC *g_pc; // предобъявление и объявление переменной

void foo(struct TagA* pa, AliasB* pb1, PointerB pb2, struct TagC* pc);
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Перекуём баги на фичи!
Re[4]: Forward declarations in C?
От: Lorenzo_LAMAS  
Дата: 19.10.09 15:50
Оценка:
совсем/не совсем — мне это не понятно. результаты разные, у одного область видимости функции, у другого — вне функции.
на мой взгляд, все же "совсем".
Of course, the code must be complete enough to compile and link.
Re[5]: Forward declarations in C?
От: Кодт Россия  
Дата: 19.10.09 16:42
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

L_L>совсем/не совсем — мне это не понятно. результаты разные, у одного область видимости функции, у другого — вне функции.

L_L>на мой взгляд, все же "совсем".

Таак, что-то я не въезжаю.
void f(struct A* p)
{
  A* q = p;
}

A* r; // хочешь сказать, что здесь A не видно? g++ уверяет меня в обратном
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Перекуём баги на фичи!
Re[6]: Forward declarations in C?
От: Lorenzo_LAMAS  
Дата: 19.10.09 22:16
Оценка:
К>
К>void f(struct A* p)
К>{
К>  A* q = p;
К>}

К>A* r; // хочешь сказать, что здесь A не видно? g++ уверяет меня в обратном
К>

пример в моем втором ответе достаточен и твой уже не нужен.
Of course, the code must be complete enough to compile and link.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.