我有一些来自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头重新创建这些默认值,最好不要自己更改数据结构?
感谢。
答案 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}