У меня есть файл заголовка 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 нет ошибки и никаких предупреждений.
Это нормально?
Вызывает ли такая проблема неопределенное поведение при запуске программы?
Каждый исходный файл C обрабатывается компилятором отдельно, поэтому вам не нужно беспокоиться о том, что один и тот же заголовочный файл включается двумя разными исходными файлами.
Проблема будет возникать, если вы попытаетесь включить один и тот же заголовочный файл в один исходный файл. Вот почему включение защитников в файлы заголовков (прагмы или #ifndef...
) - широко распространенная идиома в программировании на языке С.
Другая проблема, которая случится, заключается в том, что и c1.c и c2.c получат свои собственные ns. Поэтому, если его изменить, другие не будут видеть изменений. Вообще говоря, это не то, что нужно.
Соглашение состоит в том, чтобы определить ns в одном файле c, поместить его как extern в файл заголовка и использовать его в других c файлах.