定义静态常量结构体

12

这个问题涉及到Symbian操作系统,但我认为C/C++老手也可以帮助我。 我正在将一个开源库编译到Symbian操作系统上。使用GCCE编译器,经过一些调整后,它可以无错误地编译。 我将编译器改为ARMV5,现在我遇到了多个静态const结构的定义错误,例如: 我有一个结构体:

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

以下是类型为Foos的常量结构体定义:

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

在这个问题上,GCCE没有问题,而ARMV5会出现"expected an expression"错误,关于这个问题我通过Google搜索得知,这种方法在C语言中应该是合法的,但在C++中是不合法的。如果是这种情况,那么在C++中声明const结构体的可能性是什么?如果不是这种情况,那么任何其他帮助都将不胜感激。

提前致谢 :)

4个回答

17
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);

5

这是合法的C99,但不是合法的C89或C ++。假设您将其编译为C ++,因此如果使用编译器选项强制执行标准兼容性,则GCCE也将拒绝它。

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

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


5

请注意,某些版本的Symbian操作系统不支持DLL中的可写静态数据,这在可写静态数据方面需要特别注意。如果您的示例是const类型或者只支持Symbian v8.1b或更高版本,则可能不会受到影响。

我曾经陷入过这个陷阱,所以想提醒一下大家。

引用自上述链接:

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

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


是的,我知道在8.1之前的操作系统中静态数据的限制,所以我正在使用9.1及更高版本的库。 无论如何,感谢你留下这个重要的备注! - dudico

4
点样式表示法在 ANSI C99 中是有效的,但在 ANSI C89 中无效。几乎所有的 C 编译器都没有实现 C99。

1
gcc支持点样式符号,无需任何命令行选项。还有其他的C编译器吗? :O - 2.718
很遗憾,是的。MSVC已经冻结了其C支持,据我所知。 - user82238

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接