下面的代码片段在Mac上和gcc一起编译得很好,但是无法在Windows上用lcc 32编译:
typedef struct Foo Foo;
typedef struct Bar Bar;
struct Bar { int age; int height; };
struct Foo { Bar barOne; Bar barTwo; };
// Elsewhere, in some function:
Bar barOne = { 2, 4 };
Bar barTwo = { 6, 8 };
Foo instance = { barOne, barTwo };并给出了以下错误:
发现了'struct‘预期的'int’
通过这样初始化结构,我可以“克服”这个问题:
Foo instance = { barOne.age, barOne.height, barTwo.age, barTwo.height };所以,我知道发生了什么.但我觉得这会使我的代码变得更加复杂(我需要理解我正在使用的其他结构的实现和布局,而不是简单地使用它们--如果布局发生了变化,我就必须对使用该结构的其他任何人进行筛选)。
我想知道LCC是“更严格”(遵循某种标准)还是“更愚蠢”(编译器太笨,无法处理这种情况)。
谢谢。
另外,请参阅我的另一个LCC 32问题:LCC: Forward Declaration of Typedef'd Enum Failing?。
发布于 2011-09-01 17:12:13
好吧,这不叫小C编译器,有时是免费的。它可以处理大多数事情,但为了节省空间和时间,在这种情况下通常会更加严格。实现看似简单的东西通常不在编译器中。不管是LCC还是LCC,都从来没有更新过以处理这些情况。是否有一个具体的原因使用LCC而不是Borland,MSVC++,Cygin/明威32 gcc?
发布于 2011-09-01 17:36:50
如所写:
typedef struct Foo Foo;
typedef struct Bar Bar;
struct Foo { Bar barOne; Bar barTwo; };
struct Bar { int age, int height };
// Elsewhere, in some function:
Bar barOne = { 2, 4 };
Bar barTwo = { 6, 8 };
Foo instance = { barOne, barTwo };代码应该无法在任何地方编译(特别是在MacOS X 10.7.1和GCC 4.6.0上失败),这些错误(加上其他错误):
xx.c:4: error: field ‘barOne’ has incomplete type
xx.c:4: error: field ‘barTwo’ has incomplete type这是因为在定义Bar之前尝试使用它。反转结构定义的顺序,修复条形中的语法错误(逗号应为分号;缺失分号),然后(最后)在MacOS X上编译。
关于使用结构作为初始化器的标准是什么?
§6.7.8初始化
13具有自动存储持续时间的结构或联合对象的初始化器应是如下所述的初始化程序列表,或具有兼容结构或联合类型的单个表达式。在后一种情况下,对象(包括未命名成员)的初始值是表达式的初始值。
考虑函数的上下文(这段代码编译OK,GCC设置为fussy):
typedef struct Foo Foo;
typedef struct Bar Bar;
struct Bar { int age; int height; };
struct Foo { Bar barOne; Bar barTwo; };
void somefunction(void)
{
Bar barOne = { 2, 4 };
Bar barTwo = { 6, 8 };
Foo instance = { barOne, barTwo };
}从表面上看,在我看来,barOne和barTwo并不是单一的表达式。然而,该标准接着说:
否则,具有聚合或联合类型的对象的初始化程序应该是元素或命名成员的大括号括起来的初始化程序列表。
如果聚合必须是封闭的大括号,那么编写它就可以了:
Foo instance = { { barOne }, { barTwo } };尽管如此,GCC坚决反对这种说法。
i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)
/usr/bin/gcc -g -std=c99 -Wall -Wextra -Wmissing-prototypes -c xx.c
xx.c:8: warning: no previous prototype for ‘somefunction’
xx.c: In function ‘somefunction’:
xx.c:11: error: incompatible types in initialization
xx.c:11: warning: missing initializer
xx.c:11: warning: (near initialization for ‘instance.barOne.age’)
xx.c:11: error: incompatible types in initialization
xx.c:11: warning: missing initializer
xx.c:11: warning: (near initialization for ‘instance.barTwo.age’)
xx.c:11: warning: missing initializer
xx.c:11: warning: (near initialization for ‘instance.barOne’)
xx.c:11: warning: unused variable ‘instance’总的来说,我倾向于相信GCC的判断,并将矛头指向LCC没有有效地处理案件。这将需要对C标准第6.7.8节进行完整的解析,而我还没有提供所有的材料(在开始示例之前,它将转到第23节)。
https://stackoverflow.com/questions/7273846
复制相似问题