включение stdio в заголовочный файл - PullRequest
2 голосов
/ 22 марта 2012

Я не совсем уверен, но это выглядит неправильно:

У меня есть файл заголовка с именем фракция.h , в котором я сохраняю структуру дроби и методы для ее обработки, одинЭтот метод используется для записи дроби в файл, и в сигнатуре этой функции один аргумент - это указатель FILE .

дроб.ч:

...
const Fraction * fraction_fwrite(const Fraction * f, FILE * file);
...

фракция.c:

#include <stdio.h>
#include "fraction.h"
...

Теперь, когда я пытаюсь скомпилировать программу, которая использует дробь, я получаю ошибку,

здесьчто у меня есть в моем Makefile :

program_test: fraction.o program_test.o

, и я включаю дроб.ч в program_test.c конечно.но я получаю эту ошибку:

дроб.ч: 34: 54: ошибка: неизвестное имя типа «ФАЙЛ»

кто-то может объяснить различные шаги, с помощью которыхкомпилятор включает файлы?поскольку <stdio.h> находится в дробной части. с , так почему же возникает эта ошибка необнаруженного типа?

следует ли включать <stdio.h> в дробной части. ч ?что выглядит не совсем уместно из моего жалкого опыта.

Ответы [ 3 ]

5 голосов
/ 22 марта 2012

Когда вы компилируете program_test, компилятор не смотрит на другие файлы .c, только те файлы, которые вы #include в файле, который вы на самом деле компилируете.

Итак, вы должны либо #include <stdio.h> в тестовой программе, как в fraction.c, или включите его в заголовочный файл.

Хотя стандарт C говорит, что файлы стандартной библиотеки не будут включать друг друга, нет ничего, что говорило бы о том, чтопользовательские файлы не могут этого сделать.На самом деле их обычно гораздо проще использовать, если они это делают.

1 голос
/ 22 марта 2012

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

Итак, предварительно обработанный файл fragments.c выглядит так:

    stdio.h contents
    fragment.h contents
    fragment.c contents

Обратите внимание, что определение FILE будет включено через stdio.h до того, как оно будет упомянуто в fragment.h.

Вы должны включить stdio.h в дробный.h, чтобы избавиться от этой ошибки.

0 голосов
/ 22 марта 2012

Включить stdio.h в program_test.c. Если вы не включите stdio.h в program_test.c (который включает в себя fra.h), компилятор не знает определения FILE, используемого в дробном файле., И выдает ошибку.

И вы действительно должны включить stdio.h во дробную часть. H

...