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

Sir*_*tty 1 c types header

我有一些来自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};
Run Code Online (Sandbox Code Playgroud)

...

// Source file.

RGBColor aColor = kRGB_White;
Run Code Online (Sandbox Code Playgroud)

问:出于兼容性原因,我需要将这些标头转换为C. 有没有办法为C头重新创建这些默认值,最好不要更改数据结构本身?

谢谢.

Mic*_*urr 5

要防止出现重复全局定义问题,您需要将const标题中结构的声明更改为:

extern const RGBColor kRGB_White;
extern const RGBColor kRGB_Black;
Run Code Online (Sandbox Code Playgroud)

并将定义放在一个链接的.c文件中.

另一种方法是将const结构更改为静态,这样当它们最终出现在几个不同的模块中时不会受到影响:

static const RGBColor kRGB_White = {1.0f, 1.0f, 1.0f};
static const RGBColor kRGB_Black = {0.0f, 0.0f, 0.0f};
Run Code Online (Sandbox Code Playgroud)

这可能会导致对象在最终链接图像中出现不止一次,但今天的链接器可能足够聪明,可以摆脱重复(我认为 - 如果您正在执行此操作的结构,则某些测试可能是有序的)大和/或众多).

如果您担心使用consts初始化其他变量,请执行以下操作:

RGBColor aColor = kRGB_White;
Run Code Online (Sandbox Code Playgroud)

在C中很好(程序员认为C由于某种原因不允许这样做似乎相对常见 - 也许在预标准C中并不总是允许它?).