Как избежать дублирования глобальных объектов?
От: Невидимка  
Дата: 15.11.14 14:21
Оценка: -2 :)
Доброго дня.

Есть наборы глобальных объектов, создаваемых автоматически:

#define OBJ(name) sometype name
#define DECL(name) OBJ(name);
#define EDECL(name) extern DECL(name)

// fmt1.h
#define X(name) EDECL(name)
#define FMT1    \
X(time)    \
X(speed)
FMT1

// fmt2.h
#define FMT2    \
X(time)    \
X(pressure)
FMT2

// fmt1.c (fmt2.c аналогичен)
#include "fmt1.h"
#undef X
#define X(name) DECL(name)
FMT1

Теперь, при использовании двух форматов одновременно, будет ошибка — два одинаковых объекта. Моя задача: сделать так, чтобы кросс-объект был один (а не несколько разных с уникальными именами).

Вот такое, естественно, не канает (nested # и всё такое):
#define X(name) \
#ifndef DEF_##name    \
DECL(name)    \
#define DEF_##name    \
#endif

...но очень хочется. Как быть?

зы. Ручные флажки (DEF_name) для каждого параметра (с отказом от автогенерации), кроение списков с выделением общей части — сами понимаете, слишком муторно, не подходит.
С уважением, Дмитрий
Re: Как избежать дублирования глобальных объектов?
От: uzhas Ниоткуда  
Дата: 15.11.14 15:18
Оценка:
Здравствуйте, Невидимка, Вы писали:

Н>Теперь, при использовании двух форматов одновременно, будет ошибка — два одинаковых объекта. Моя задача: сделать так, чтобы кросс-объект был один (а не несколько разных с уникальными именами).


какие компиляторы надо поддержать?
в студии есть довольно полезный __declspec( selectany )
ссылка: http://msdn.microsoft.com/en-us/library/5tkz6s71.aspx

либо навесьте const этим объектам и они будут иметь внутреннее связывание и перестанут конфликтовать
Re: Как избежать дублирования глобальных объектов?
От: _NN_ www.nemerleweb.com
Дата: 16.11.14 09:01
Оценка:
Здравствуйте, Невидимка, Вы писали:


Н>Доброго дня.


Н>Есть наборы глобальных объектов, создаваемых автоматически:


Лучше всего не создавать глобальных объектов
Если можно const как указали, то лучше const.
Если нельзя, то можно обернуть анонимное пространство имен или в функции:

// Вариант 1.
#define CREATE_VAR(x) \
 namespace \
 { \
  int x = 1; \
 }

// Вариант 2. 
#define CREATE_VAR(x) \
  static int& x() \
  { \
    int var; \
    return var; \
  }
http://rsdn.nemerleweb.com
http://nemerleweb.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.