我有一堆代码需要分析并准备导入到一个新项目中。通常会出现以下模式:
typedef struct t_Substruct
{
/* some elements */
} ts;
typedef struct t_Superstruct
{
/* some elements */
ts substruct;
/* some more elements */
} tS;
void funct1(const tS * const i_pS, tS * const o_pS)
{ /* do some complicated calculations and transformations */ }
void funct2(const ts * const i_ps, tS * const o_pS)
{ /* do some complicated calculations and transformations */ }
void funct3(const tS * const i_ps, ts * const o_ps)
{ /* do some complicated calculations and transformations */ }
一般来说,会从i_参数进行读取并向o_参数进行写入。现在可能会有如下调用:
void some_funct()
{
tS my_struct = {0};
/* do some stuff */
funct1(&my_struct,&my_struct);
funct2(&my_struct.substruct, &my_struct);
funct3(&my_struct, &my_struct.substruct);
}
我不确定这些函数和调用上存在哪些可能的问题和调用环境:
- 在语言约束和/或未定义行为方面,是否允许在const正确性的上下文中进行此类声明或调用?
- 在同一功能中更改被保护引用和非保护引用的对象是否被允许?
- 我知道在序列点之间多次访问/修改同一变量时会出现一些问题(虽然我不完全确定我是否完全理解了序列点事物)。这些或类似的问题是否适用于此处,以及以何种方式适用?
- 如果不是未定义行为,存在任何其他典型问题会降低上述情况的可移植性吗?
- 如果存在问题,那么什么是一个好的(安全的,并且如果可能的话开销尽可能小)通用模式,以允许这些调用,以便这些问题可能不会在每个其它行发生?
我必须在C90中实施,但是如果在上述情况下移植到其他C版本中存在问题,则对我也很重要。
提前感谢您。
&my_struct.substruct
,因为.
比&
的优先级更高。 - unwind