C-如何为C标头中的类型设置默认值 我有一些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};

C-如何为C标头中的类型设置默认值 我有一些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};,c,header,types,C,Header,Types,出于兼容性原因,我需要将这些头文件转换成C。有没有一种方法可以在不改变数据结构的情况下为C头重新创建这些默认值 谢谢。为了防止出现重复全局定义的问题,您需要将标题中的const结构声明更改为: extern const RGBColor kRGB_White; extern const RGBColor kRGB_Black; 并将定义放在一个链接到的.c文件中 另一种方法是将const结构更改为静态,这样当它们在几个不同的模块中结束时就不会受到影响: static const RGBColo

出于兼容性原因,我需要将这些头文件转换成C。有没有一种方法可以在不改变数据结构的情况下为C头重新创建这些默认值


谢谢。

为了防止出现重复全局定义的问题,您需要将标题中的
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};
这可能会导致对象在最终链接的图像中出现不止一次,但今天的链接器可能足够聪明,可以消除重复的对象(我认为,如果您使用的结构很大和/或很多,可能需要进行一些测试)

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

RGBColor aColor = kRGB_White;

在C中没有问题(程序员似乎比较普遍地认为C由于某种原因不允许这样做-也许在标准C之前并不总是允许这样做?)

为了防止重复全局定义的问题,您需要将标题中的
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};
这可能会导致对象在最终链接的图像中出现不止一次,但今天的链接器可能足够聪明,可以消除重复的对象(我认为,如果您使用的结构很大和/或很多,可能需要进行一些测试)

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

RGBColor aColor = kRGB_White;

在C中很好(程序员似乎普遍认为C由于某种原因不允许这样做-也许在标准C之前并不总是允许这样做?)。

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

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

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

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


如果你能保证C99,你至少可以做
((RGBColor){1.0f,1.0f,1.0f})
来阻止人们尝试类似
float f[]=kRGB\u-White。[插入免责声明,说明试图通过类型系统而不是明确无误的文档阻止人们做愚蠢的事情是徒劳的。]这将作为初始值设定项工作,但在赋值中不起作用。而且,它在左值上下文中也不起作用。我想OP可能也需要这些用途。@AndreyT-
const
对象在左值上下文中也不起作用,在C99中,我相信我修改的版本在赋值中也能起作用。@Chris Lutz:
const
对象在左值上下文中也能起作用,因为它们是左值。+1,但也许您可以编辑您的答案,以包含复合文字版本。既然我已经做到了,那么使用
const
的复合文本可以更好地优化,因为编译器可以将多个实例折叠成一个。这将是
(RGBColor const){1.0f,1.0f,1.0f}
。如果你能保证C99,你至少可以做
((RGBColor){1.0f,1.0f,1.0f}
来阻止人们尝试
float f[]=kRGB\u-White。[插入免责声明,说明试图通过类型系统而不是明确无误的文档阻止人们做愚蠢的事情是徒劳的。]这将作为初始值设定项工作,但在赋值中不起作用。而且,它在左值上下文中也不起作用。我想OP可能也需要这些用途。@AndreyT-
const
对象在左值上下文中也不起作用,在C99中,我相信我修改的版本在赋值中也能起作用。@Chris Lutz:
const
对象在左值上下文中也能起作用,因为它们是左值。+1,但也许您可以编辑您的答案,以包含复合文字版本。既然我已经做到了,那么使用
const
的复合文本可以更好地优化,因为编译器可以将多个实例折叠成一个。这将是
(RGBColor const){1.0f,1.0f,1.0f}
不是C合法的,因为
intfoo[4]={1,2,3,4};int bar[4]=foo
是不合法的,数组似乎比结构有更多的暴露。我倾向于推荐
静态常量
方法-它使编译器可以使用
常量
对象的定义,而不需要跨模块优化链接时间。您也不能使用
const
对象来初始化具有静态存储持续时间的对象-您还应该为这种情况创建
#define KRGB_WHITE_static{1.0f,1.0f,1.0f}
。感谢您的帮助。在OS X 10.6.6上使用GCC4.0时,“静态常量”方法会导致“重复符号”错误。悲伤的脸。更可悲的是,将它们重新定义为宏的方法也不起作用。我想我必须接受建议,将它们声明为extern,并将它们全部粘贴到源文件中。干杯。@SirRatty:听起来好像你没有防止多次包含标题的防护装置(或者在某个地方有一个零散的
extern
符号声明)。我的所有标题(甚至导入)中都有“ifdef MY#u FILE”endif防护装置,我也没有使用extern。所以,是的,不确定那里发生了什么。我相信很多人认为,
RGBColor aColor=kRGB\u White
不是C合法的,因为
intfoo[4]={1,2,3,4};int bar[4]=foo
是不合法的,数组似乎比结构有更多的暴露。我倾向于推荐
静态