Существует третий вариант, который может представлять интерес.
Он полностью скрывает struct single
в Single.c
. Следовательно, случайный доступ невозможен.
Single.h
void initSingle(void);
void printSingle(void);
Single.c
:
#include <stdio.h>
#include "Single.h"
struct Single {
int x;
};
static struct Single oneAndOnly;
void initSingle(void)
{
oneAndOnly.x = 10;
}
void printSingle(void)
{
printf("x = %d\n", oneAndOnly.x);
}
main.c
:
#include "Single.h"
int main()
{
initSingle();
printSingle();
return 0;
}
Демонстрация в реальном времени на Wandbox
На самом деле, этот подход похож на P__J __ . Я просто слишком медленно нажимал кнопку Отправить.
Мне понадобилось некоторое время, чтобы понять, что решение в квесте должно предотвратить (случайную) вторую переменную типа oneAndOnly
.
«Скрытие» struct
в файле C со статическим экземпляром, вероятно, лучшее, что может быть в C. Даже примеры счетчиков в ответе melpomene не должны работать в этом случае.
Если требуется доступ на чтение / запись к одному экземпляру, я бы добавил что-то вроде функций "getter" / "setter".
Это напомнило мне шаблон Singleton , хотя я не уверен, является ли это законным использованием для неOO-языка, такого как C. Немного погуглив, я обнаружил (также) Как создать синглтон в C? , о котором я считаю полезным.
Я немного погуглил по фактическому вопросу ОП, действителен ли ее / его Код 2. Я подозревал что-то похожее на дублированное определение (может быть, потому что я слишком долго работал на C ++ в повседневной работе).
На самом деле, я попробовал код 2 OP в Wandbox & ndash; нет повторяющегося определения проблемы. Наконец, я обнаружил Являются ли глобальные переменные внешними по умолчанию или это эквивалентно объявлению переменной с внешним в глобальных переменных? и пришел к выводу, что с кодом 2 тоже должно быть все в порядке.
Ограничение состоит в том, что Code 2 допускает только инициализацию по умолчанию (заполнение нулями, если я правильно помню). Как только инициализатор добавлен, компилятор жалуется (как и ожидалось), поскольку он включается несколько раз.