Нет ошибки сборки при включении заголовочного файла (содержащего определение переменной) в файлы 2 c

0

У меня есть файл заголовка h1.h содержащий следующее объявление переменной:

h1.h

struct namespaces
{
    char *soap_env;
    char *soap_enc;
    char *xsd;
    char *xsi;
} ns;

Я включил файл заголовка h1.h в 2 файла C c1.c и c2.c

c1.c

#include "h1.h"

c2.c

#include "h1.h"

Я ожидаю получить ошибку в сборке, но я этого не сделал. В сборке In нет ошибки и никаких предупреждений.

Это нормально?

Вызывает ли такая проблема неопределенное поведение при запуске программы?

  • 4
    Почему вы ожидаете ошибку? Там нет ничего, кроме объявлений в шапке ??
Теги:
compilation

2 ответа

5
Лучший ответ

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

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

2

Другая проблема, которая случится, заключается в том, что и c1.c и c2.c получат свои собственные ns. Поэтому, если его изменить, другие не будут видеть изменений. Вообще говоря, это не то, что нужно.

Соглашение состоит в том, чтобы определить ns в одном файле c, поместить его как extern в файл заголовка и использовать его в других c файлах.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню