C - 如何为C标头中的类型设置默认值

时间:2011-01-06 04:16:51

标签: c header types

我有一些来自C ++背景的标题,它为声明的类型使用了许多预先出现的“默认值”。 e.g。

// 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 个答案:

答案 0 :(得分:5)

为了防止重复全局定义出现问题,您需要将标题中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 :(得分:1)

如果您无法将默认值声明移出头文件,请将它们重新定义为宏:

// Might not be a clean solution...
#define kRGB_White {1.0f, 1.0f, 1.0f} 
#define kRGB_Black {0.0f, 0.0f, 0.0f}