定义静态const结构

时间:2009-03-29 14:32:50

标签: c++ c symbian

这个问题与Symbian OS有关,但我认为C / C ++老手也可以帮助我。 我正在为Symbian OS编译一个开源库。使用GCCE编译器,它编译没有错误(经过一些修补:))。 我将编译器更改为ARMV5,现在我对静态const结构的定义有多处错误,例如: 我有一个结构:

typedef struct Foos{
    int a;
    int b;
} Foos;

以下定义类型为Foos的const结构

static const Foos foo = {
    .a = 1,
    .b = 2,
};

GCCE没有问题,ARMV5在“.a = 1,.b = 2”上出现“预期表达式”错误。从我用Google搜索的内容来看,我认为这种方法在C语言中应该是合法的,但在C ++中是非法的,如果是这样的话,那么在C ++中声明const结构的可能性是什么?如果情况并非如此,那么任何其他帮助将不胜感激。

提前致谢:)

4 个答案:

答案 0 :(得分:15)

static const struct Foos foo = { 1, 2 };

使用g ++和gcc进行编译。

正如onebyone指出的那样,你可以定义一个构造函数:

typedef struct Foos {
    int a;
    int b;
    Foos(int a, int b) : a(a), b(b) {}
};

你会像这样初恋:

static const struct Foos foo(1, 2);

答案 1 :(得分:5)

这是合法的C99,但不是合法的C89或C ++。据推测,您将其编译为C ++,因此如果您使用编译器选项来强制执行标准,那么GCCE也会拒绝它。

您可以在C或C ++中执行foo = {1, 2};。显然你失去了那里的字段名称的好处:你必须依靠获得正确的订单。

C ++中另一个不错的选择是为结构定义构造函数,并使用static const Foos foo(1,2);进行初始化。这确实可以防止结构为POD,因此您无法对其在内存中的表示做出相同的假设。

答案 2 :(得分:5)

请注意,某些版本的Symbian上的DLL不支持writable static data。它可能不会影响您正在做的事情,因为您的示例是const,或者您可能只支持Symbian v8.1b或更高版本。

当我陷入陷阱时,我想我会指出它。

从上面的链接引用:

  

支持全局可写静态   Symbian OS上的数据

     

Symbian OS支持全局可写   所有版本的EXE中的静态数据   和手机。

     

基于的Symbian OS版本   EKA2内核(8.1b及更高版本)支持   目标硬件上的DLL中的WSD。   版本8.1a及更早版本,基于   EKA1内核,不支持全局   DLL中的WSD。

答案 3 :(得分:4)

点样式符号我认为在ANSI C99中有效。它是无效的ANSI C89。几乎所有的C编译器都没有实现C99。