我正在尝试从通过变量传递的常量值初始化结构中的字段。
typedef struct _A{
uint a;
}A;
const A a = {9} ; const A b = { .a = 10 }; const A c = {0};
typedef struct _Z{
A a;
A b;
A c;
}Z;
Z z = { a,b,c };
但这会产生编译器错误:initializer element is not constant
什么不是那么明显因为a,b和c被声明为const a在运行时不应该是可修改的。
我想要记忆的是:
0x00 9
0x04 10
0x08 0
因为struct只是一个整数数组。
现在的问题是如何告诉编译器(使用arm-none-eabi-gcc)变量a
,b
和c
像定义一样使用并且可以/应该用他们的内容替换,因为只有z
的引用才会出现在正在运行的程序中?
也许是一些pragma甚至是预处理器指令?
我正在我初始化A
的同一个宏中构建a
。看起来像这样,但有点复杂。
#define bar(name, ...)\
typedef struct __bar_##name{\
List(applydef, __VA_ARGS__)\
}bar_##name;\
const bar_##name name ={List(applyset, __VA_ARGS__)};
bar(foobar, a,b)
由于过度使用了定义,上面的代码是自扩展的。 我在这里接受的另一个解决方案是不生成一个新的结构但是一个新的定义我可以抛出宏看起来像这样。
答案 0 :(得分:0)
遗憾的是,初始化资源class WhisperForm(forms.ModelForm):
class Meta:
model = Whisper
fields = '__all__'
labels = {'whisper': 'Custom label text here'}
并非不变,但您对{a,b,c}
的声明需要它。
z
初始值设定项中的常量表达式允许更多的纬度。这样的常量表达式应为或评估为以下之一:
- 算术常量表达式
- 一个空指针常量,
- 地址常量,或
- 对象类型的地址常量加上或减去整数常量表达式。
[C99: 6.6/7]:
具有静态存储持续时间的对象的初始化程序中的所有表达式都应是常量表达式或字符串文字。
[C99: 6.7.8/4]:
具有静态存储持续时间,因为您在全局范围内声明了它。如果您将其声明移动到函数中,那么此规则将不适用。
尽管使用了z
,但a
,b
或c
这两个名称都不符合常量表达式:
const
算术常量表达式应具有算术类型,并且只能具有整数常量,浮点常量,枚举常量,字符常量和[C99: 6.6/8]:
表达式的操作数。算术常量表达式中的转换运算符只能将算术类型转换为算术类型,除非作为结果为整数常量的sizeof
运算符的操作数的一部分。
虽然sizeof
仅包裹struct _S
,但这并不意味着 是uint
。实际上,关于uint
,你断言“struct只是一个整数数组”是错误的:你没有考虑类型。
在这方面,C ++比C语言更宽松,特别是在struct _Z
时代。