Снова включить те же заголовочные файлы в самоопределяемую функцию, которые уже включены в основную программу? - PullRequest
1 голос
/ 10 октября 2019

Должен ли я включать те же файлы заголовков, в файл заголовка для этой конкретной функции или в файл определения функции, если я уже включил их в основную программу (вызывающую программу)?

Например:

/* Text of main programm */
#include <stdlib.h>                    /* Including the headers first */
#include <stdio.h>
#include<function.h>

int funtion(void);

int main (void)
{
     /* stdio.h is needed in main with f.e.
     printf("Let us using function!); */
     function();
     return(0);
}
_____________________________________________________________________

/* Headerfile for function ("function.h") */
/*#include <stdlib.h>                Should i include the headers again here? 
#include <stdio.h> */

int function (void);
_____________________________________________________________________

/* Definition of function ("function.c")*/

/*#include <stdlib.h>                Should i include the headers again here? 
#include <stdio.h> */

int function (void)
{
     printf("You know it right, baby!\n");
}

А что если я захочу использовать специальный заголовок и его функции в самоопределяемой функции, но не в основной программе?

Я использую C, но хочуиспользовать C ++ в будущем. Если какое-либо различие между ответами для каждого из них имеет отношение к использованию, пожалуйста, укажите это.

Большое спасибо за ваши ответы.

Ответы [ 4 ]

1 голос
/ 10 октября 2019

В вашем примере у вас должен быть файл заголовка для function, и он должен быть включен в оба исходных файла. Вы хотите включить function.h в function.c, чтобы не забыть изменить заголовочный файл, если по какой-то причине вам нужно изменить сигнатуру function(), например, добавить параметр или изменить тип возвращаемого значения.

main.c

// Include any standard headers needed here
#include <stdio.h>
#include "function.h"

int main (void)
{
    printf("Calling function()");
    function();
    return(0);
}

function.h

#ifndef _FUNCTION_H_
#define _FUNCTION_H_

// Include only those headers that this header file needs

int function(void);

#endif

function.c

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

int function (void)
{
    printf("Hello\n");
}
0 голосов
/ 10 октября 2019

Надлежащая практика:

  • Каждый исходный файл или файл заголовка должен включать заголовочные файлы, которые объявляют любой идентификатор, который он использует.
  • Каждый исходный файл должен включать «свой» заголовокfile, то есть заголовочный файл, который объявляет каждый внешний идентификатор, который определяет исходный файл.

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

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

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

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

0 голосов
/ 10 октября 2019

Нет. Если ваша основная (или любая функция в текущем модуле перевода) вызывает функцию с именем function, вы должны включить заголовок, объявляющий function, но вам не нужно включать заголовки, которые включает в себя модуль перевода, определяющий function, если толькоВы также используете их.

#include "function.h" 
//^ this should be "-quoted not <-quoted because it's not a system header
//int funtion(void); //this declaration is redundant
//#include <stdio.h> isn't needed here because you're not directly calling
//functions from stdio

int main (void)
{
     function();
     return(0);
}
0 голосов
/ 10 октября 2019

Нет, вы должны включать в файл F только те файлы, которые необходимы для того, что вы объявляете или ссылаетесь (используете) в файле F.

Другими словами, в вашем главном не нужноstdio.h и stdlib.h, потому что ваш основной не использует их. Но вам нужен файл function.h, потому что вы будете использовать функцию ().

Более того, в вашем main вы объявляете:

int function(void);

, но такое же объявление уже есть в файле function.h, который выделали ранее # include.

В вашем примере, если вместо этого вы прямо объявите правильный прототип функции (), вам больше не нужно включать function.h!


С другой стороны, правильно (и просто) сформированные заголовочные файлы могут часто включаться, даже если они бесполезны или избыточны. Они замедляют компиляцию, но не оказывают вредного воздействия.

...