Как определить две глобальные переменные `const` для одного и того же значения в модуле C? - PullRequest
1 голос
/ 05 февраля 2010

Я использую пару глобальных переменных в одном из моих файлов .c, соответствующих одному объявлению extern, каждый в двух разных файлах .h (ну, один файл .h, предварительно обработанный двумя способами) , Один для общественного потребления, а другой для частного использования. Оба являются const переменными.

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

struct List_methods const List = {
  .create         = List__create,
  .create_naughty = List__create_naughty,
  // …
};
struct List_methods const Paws__List = List;

… и соответствующий ему .h:

#if defined(EXTERNALIZE)
# define  List_methods  Paws__List_methods
# define  List          Paws__List
#endif

// …

struct List_methods {
  list  (*create)         (void);
  list  (*create_naughty) (void);
  // …
} const extern List;

#if defined(EXTERNALIZE)
# undef   List_methods  Paws__List_methods
# undef   List          Paws__List
#endif

Цель здесь - обеспечить, чтобы при включении .h с определенным EXTERNALIZE включаемый файл получал доступ к переменной Paws__List, extern 'd к определению в моем файле .c , Однако, если он включает без этого определения, они получают вместо него extern 'd List (который я намереваюсь использовать во внутренних файлах, и делаю его доступным, если #include er хочет это).

Однако, в моем компиляторе присваивается значение Paws__List = List со следующей ошибкой:

Source/Paws.o/list/list.c:32:40: error: initializer element is not a
      compile-time constant
struct List_methods const Paws__List = List;
                                       ^~~~

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

1 Ответ

0 голосов
/ 05 февраля 2010

Если я вас правильно понимаю, вы хотите определить интерфейс (vtable), и реализация будет зависеть от EXTERNALIZE:

Я бы пошел по этому маршруту:


/* header file */
/* define the interface */
typedef struct List_methods {
  list  (*create)         (void);
  list  (*create_naughty) (void);
  // …
} List_Methods;

const extern List_methods Paws_List; // note: double underscores are afaik not allowed
const extern List_methods Other_List; // take any name but List

#ifdef EXTERNALIZE
# define  List          Paws_List
#else
# define  List          Other_List
#end

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

...