c - как создать объект конфигурации - PullRequest
0 голосов
/ 09 ноября 2018

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

Что было бы лучшим способом сделать это?

В настоящее время у меня есть config.h, который выглядит следующим образом:

#define OUTPUT 0
#define OUTPUT_DISPLAY 0
#define OUTPUT_WIDTH 1920
#define OUTPUT_HEIGHT 1080

typedef struct {
        const char *output
        const char *output_display;
        int output_width;
        int output_height;
} config_t;

Могу ли я создать экземпляр config_t с именем config или что-то в заголовочном файле?

Спасибо

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Создайте файл config.c, который вы добавите в компиляцию со следующим:

#include <config.h> // or "config.h"
config_t config_instance = {
        .output = "default output",
        .output_display = "default display",
};

И extern переменной в вашем файле config.h:

extern config_t config_instance;

Или лучше. Давайте создадим функцию, которая позволит получить доступ к вашей конфигурации, чтобы мы могли отслеживать и проверять изменения в ней. Создайте config.c вот так:

#include <config.h> // or "config.h"
static config_t config_instance = {
        .output = "default output",
        .output_display = "default display",
};

const config_t *config_get(void) {
     return &config_instance;
}

int config_set(const config_t *newconfig) {
     if (/* check if newconfig is valid etc. */) {
          return -1; // return error number
      }
      config_instance = *newconfig;
      return 0; // success in changing config
 }

и экспортируйте функции, добавив в файл config.h:

 const config_t *config_get(void);
 int config_set(const config_t *newconfig);
0 голосов
/ 09 ноября 2018

Вы объявляете глобальный объект в заголовочном файле:

extern config_t global_config;

, а затем определить в некотором подходящем файле .c:

config_t global_config;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...