Как подключать файлы без повторений

Опишу на простом примере.

Есть main.c:

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

int main(void)
{
    f1();
    printf("123\n");
    return 0;
}

f1.c:

#include <stdio.h>

void f1()
{
    printf("fwefw\n");
}

f1.h:

void f1();

Проблема заключается в том что на этапе сборки код из <stdio.h> дублируется два раза, оно и понятно потому что он подключен и в main.c и в f1.c но если я убираю этот заголовок из f1.c то мне при компиляции выдает предупреждение warning: implicit declaration of function 'printf'

Как правильно организовать код что бы не было дублирования кода стандартных библиотек и не получать предупреждений от компилятора ?

Пробовал еще такой ваирант, создавал файл general.h:

#ifndef GENERAL_INC
#define GENERAL_INC

#include <stdio.h>

#endif

и включал этот файл в main.c и f1.c, но все равно код с <stdio.h> дублируется.

Как сделать все правильно ? если что компилирую так: gcc f1.c main.c


Ответы (3 шт):

Автор решения: AR Hovsepyan

f1.h:

#pragma once
void f1();

f1.c:

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

void f1()
{
    printf("fwefw\n");
}

main.c:

#include "f1.h"
int main(void)
{
    f1();
    return 0;
}

Но вы сколько угодно раз можете подключать , он всеравно подключится один раз

→ Ссылка
Автор решения: Teivaz

Файлы заголовков не компилируются сами по себе. Их подключат в файлы компилируемого кода (.cpp, .c, .cxx, etc.). Как правило, они содержат только объявления типов, переменных, функций для того, чтобы следовать правилу одного определения. Код стандартной библиотеки не будет скопирован при подключении stdio.h. Возможно, некоторые функции определённые в файле заголовка будут встроены, но это решит компилятор.

Не нужно избегать подключения файлов заголовков только чтобы избежать "дублирования кода". Заголовки нужно подключать в тех файлах, которые требуют этого. К примеру, если C++ файл использует printf, то он должен подключить заголовок в котором эта функция объявлена (cstdio).

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

→ Ссылка
Автор решения: vsh

Возможно будет полезно к ознакомлению: Include-what-you-use

→ Ссылка