题
时len
正确初始化和安全的set_array
电话?
void object_copy (Object* self, Object* obj) {
int len;
object_set_array (self, object_get_array (obj, &len), len);
}
如果没有,你有什么建议?
解决方案
没有 - 有评价为参数的函数调用没有定义的顺序。
即使调用object_get_array()
具有调用object_set_array()
,值,编译器计算之前发生,并传递到object_set_array()
为len
参数可以编译器之前进行使调用object_get_array()
。
我不知道该怎么对object_set_array()
调用第二个参数的目的是 - 也许你想用逗号:
void object_foo (Object* self, Object* obj) {
int len;
object_set_array (self, (object_get_array (obj, &len), len));
}
他的工作,但很混乱,东西我不会推荐。
我想你想要的是:
void object_foo (Object* self, Object* obj) {
int len;
object_get_array (obj, &len); // get the length from obj
object_set_array (self, len)); // set the len for self
}
其他提示
没有。 object_set_array()
的第三个参数可能被评估和被评估的第二个参数(object_get_array()
)之前压入堆栈。
也许你想
void object_copy (Object* self, Object* obj) {
int len;
/* I'm just guessing as to the return type */
Object *pObj = object_get_array(obj, &len);
object_set_array (self, pObj, len);
}
您由值传递len
到object_set_array()
呼叫它被初始化之前。所以这是错误的,一个好的编译器会警告有关。该变量将包含一个随机值,所以代码不会崩溃,但它不会做,你可能想要的东西。
如果object_get_array
失败,则len
可能不会被初始化。这将是更好的通话object_get_array
先调用object_set_array
,这样,你就可以测试如果调用工作或不前。
下面是一个示例代码,请注意,我不知道是什么object_get_array
回报,所以我使用了一个void *
,使其更容易解释:
void *obj; obj = object_get_array(obj, &len); if (obj != NULL) object_set_array(self, obj, len);
这是你写的代码是危险的,但诉诸像这样快捷方式可能会导致您认为object_set_array
已经失败,而不是object_get_array
。你必须自己判断它是否会失败与否,我总是假定代码失败,这样我可以采取防护措施,你的方法会有所不同,某些快捷方式都行,这个人是不是!
虽然,执行C语言代码从左至右,在表达是如何进行评估(依赖于编译器和编译的代码)时,如果该函数的工作,那么,len
将被初始化的顺序,但它是也不安全。
希望这有助于 最好的祝福, 汤姆。
这也将工作:
ARRAY object_get_array (Object* self, int* len);
void object_set_array (Object* self, ARRAY array, const int* len);
// ...
void object_copy (Object* self, Object* obj) {
int len;
object_set_array (self, object_get_array (obj, &len), &len);
}
因为调用object_get_array()
将总是调用object_set_array()
,在该点len
将已被设置为正确的值之前进行评价。