我使用嵌入式的东西,所以,我为 MCU 使用特殊的 C 编译器 C30。我对它与临时结构的行为感到困惑。
但是,也许我不知道什么,这是预期的行为?
考虑小代码:
typedef struct {
int a;
int b;
} T_TestStruct1;
void test1(T_TestStruct1 *p_test_struct)
{
/* do something */
}
这些呼吁test1()
:
void some_function()
{
{
T_TestStruct1 par = {
.a = 1,
.b = 1,
};
test1(&par);
}
{
T_TestStruct1 par = {
.a = 2,
.b = 2,
};
test1(&par);
}
}
这里一切正常:T_TestStruct1
堆栈中只分配了一个实例。但我喜欢使用较短的表达式:
void some_function()
{
test1(&(T_TestStruct1){
.a = 1,
.b = 1,
});
test1(&(T_TestStruct1){
.a = 2,
.b = 2,
});
}
然后,这两个结构{.a = 1, .b = 1}
都{.a = 2, .b = 2}
被分配到堆栈中。但是,在我看来,他们不应该是。实际上只需要一个实例。
只是偶然,我尝试过:
void some_function()
{
{
test1(&(T_TestStruct1){
.a = 1,
.b = 1,
});
}
{
test1(&(T_TestStruct1){
.a = 2,
.b = 2,
});
}
}
结果是一样的。
那么,它是有意的行为,还是编译器中的错误?