这个问题与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结构的可能性是什么?如果情况并非如此,那么任何其他帮助将不胜感激。
提前致谢:)
答案 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。