2014-12-31 3 views
3

Является ли законным переслать декларацию структур и функций, предоставляемых библиотекой стандартного языка C?Вперед объявить объекты в стандартной библиотеке C?

Мой фон - C++, в котором ответ отрицательный. Основная причина этого заключается в том, что структура или класс, предусмотренные стандартной библиотекой C++, могут быть шаблоном за кулисами и могут иметь «секретные» параметры шаблона и поэтому не могут быть правильно объявлены наивным объявлением без шаблона. Даже если пользователь точно определяет, как перенаправить объявление определенного объекта в конкретную версию конкретной реализации, реализация не обязана не нарушать это объявление в будущих версиях.

Я не имею копию любого стандарта C под рукой, но, очевидно, нет шаблонов в C.

Так это законно направить объявить объекты в стандартной библиотеке C?

Другая причина, по которой объекты в стандартной библиотеке C++ не могут быть объявлены в пересылке, заключается в том, что заголовки, предоставленные реализацией, не должны следовать нормальным правилам. Например, в недавнем вопросе я спросил, должен ли заголовок C++, предоставленный реализацией, быть фактическим файлом, а ответ - нет. Я не знаю, если какой-либо из этого относится к С.

Стандартная библиотека C используется как C и C++, но на этот вопрос я спрашиваю только о С.

+0

Да, вы можете переадресовать объявлять функции и структуры в C. Вы можете сделать свой компилятор знает, что есть определение где-то и просто объявления в файле заголовка – Gopi

+0

AFAIK, вы, конечно, можете переадресовать объявить 'стандарт C' библиотечные функции, тем самым устраняя требование включения соответствующего файла заголовка, но думаю, что это не _recommended._ –

+1

@SouravGhosh Вещи, которые не рекомендуются, но обычно работают, это те смешные крайние случаи языковой адвокации, о которых я прошу! – Praxeolitic

ответ

5

Передовые декларации структур всегда допустимы в C. Однако не так много типов могут использоваться таким образом. Например, вы не можете использовать форвардное объявление для FILE просто потому, что имя тега структуры не указано (и теоретически это может быть не структура вообще).

Раздел 7.1.4 пункта 2 n1570 дает вам разрешение сделать то же самое с функциями:

При условии, что библиотечная функция может быть объявлена ​​без ссылки на какой-либо тип, определенный в заголовке , это также разрешено объявлять функцию и использовать ее без включения ее связанного заголовка .

Это было довольно распространено. Я думаю, что рассуждение здесь состоит в том, что жесткие диски медленны, и меньше #include означает более быстрое время компиляции. Но это уже не 80-е годы, и у всех нас есть быстрые процессоры и быстрые жесткие диски, поэтому несколько #include даже не заметили.

void *malloc(size_t); 
void abort(void); 

/* my code here */ 
+0

Как насчет передовых объявлений структур? – Praxeolitic

+0

@Praxeolitic: «Передовые декларации структур всегда допустимы». –

+1

@Praxeolitic: OTOH, я не знаю ни одной структуры, которая объявляется в стандартном заголовке, где указаны детали реализации. Таким образом, вопрос может не возникнуть вообще. Если вы выясните, как структура объявлена ​​в определенной реализации, вы можете отправить ее вперед. – mafso

0

да, вы можете это совершенно действительный. это тоже можно сделать со стандартной библиотекой.

double atof(const char *); 

int main() { 
    double t = atof("13.37"); 
    return 0; 
} 

#include <stdio.h> 

вещи похож можно сделать с помощью структур, переменных и т.д.

Я бы рекомендовал прочитать вики-страницу, которая показывает некоторые примеры C:

http://en.wikipedia.org/wiki/Forward_declaration

это указано в c, раздел 7.1.4, абз. 2 от n1570

При условии, что функция библиотеки может быть объявлена ​​без ссылки ence к любому типу, определенному в заголовке, также разрешено объявлять функцию и использовать ее без включения связанного с ней заголовка.

+1

ну, речь идет о стандартных библиотечных функциях. –

+1

Объявление 'fopen()' не полезно, потому что вам нужно объявление для 'FILE', которое находится в' ', что означает, что у вас уже есть объявление для' fopen() '. –

+0

true сделал объявление с 'atof()' вместо –

Смежные вопросы