C - как установить значения по умолчанию для типов в заголовках C - PullRequest
1 голос
/ 06 января 2011

У меня есть несколько заголовков из фона C ++, которые используют много предварительно запеченных «значений по умолчанию» для объявленных типов.например,

// Header.

typedef struct
{
    float red;
    float green;
    float blue;
} RGBColor;

// Defaults.
const RGBColor kRGB_White = {1.0f, 1.0f, 1.0f};
const RGBColor kRGB_Black = {0.0f, 0.0f, 0.0f};

...

// Source file.

RGBColor aColor = kRGB_White;

Q.Мне нужно преобразовать эти заголовки в C для совместимости.Есть ли способ заново создать эти значения по умолчанию для заголовка C, желательно без изменения самих структур данных?

спасибо.

Ответы [ 2 ]

5 голосов
/ 06 января 2011

Чтобы избежать проблем с дублирующимися глобальными определениями, вам нужно изменить объявления ваших const структур в заголовках на:

extern const RGBColor kRGB_White;
extern const RGBColor kRGB_Black;

И поместите определения в один файл .c, который будет связан.

Альтернативой является изменение структур const на статические, чтобы не повредить их, если они окажутся в нескольких разных модулях:

static const RGBColor kRGB_White = {1.0f, 1.0f, 1.0f};
static const RGBColor kRGB_Black = {0.0f, 0.0f, 0.0f};

Это может привести к тому, что объекты будут появляться более одного раза в конечном связанном изображении, но сегодняшние компоновщики, вероятно, достаточно умны, чтобы избавиться от дубликатов (я думаю - некоторые тесты могут быть в порядке, если структуры вы делаете это с большим и / или многочисленным).

Если вы беспокоитесь об использовании consts для инициализации других переменных, это:

RGBColor aColor = kRGB_White;

нормально в C (программисты, как правило, думают, что C по какой-то причине не позволяет этого - может быть, это не всегда разрешалось в предстандартном C?).

1 голос
/ 06 января 2011

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

// Might not be a clean solution...
#define kRGB_White {1.0f, 1.0f, 1.0f} 
#define kRGB_Black {0.0f, 0.0f, 0.0f}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...