12

这个问题与 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”上出现“预期表达式”错误。根据我在谷歌上搜索的内容,我认为这种方法在 C 中应该是合法的,但在 C++ 中是非法的,如果是这种情况,那么在 C++ 中声明 const 结构的可能性是什么?如果不是这种情况,那么任何其他帮助将不胜感激。

提前致谢 :)

4

4 回答 4

16
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);
于 2009-03-29T14:36:00.267 回答
5

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

您可以foo = {1, 2};使用 C 或 C++ 进行操作。显然,您失去了字段名称就在那里的好处:您必须依靠正确的顺序。

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

于 2009-03-29T14:47:06.887 回答
5

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

我以为我会在我曾经陷入那个陷阱时指出这一点。

从上面的链接引用:

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

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

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

于 2009-03-29T20:05:48.773 回答
4

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

于 2009-03-29T14:38:05.877 回答