我正在使用一个 API,其中调用者传入一个指向东西的指针数组,以及数组的长度。为了使我的代码更具可读性/可维护性,我希望能够有效地为每个参数命名,而不是将它们称为arg[0]
,arg[1]
等。即使声明对所有可能参数的引用是否安全由于可选参数,传入的数组可以是不同的大小?
我正在尝试做这样的事情:
void myFunc(int out_args[], size_t nargs) {
int &foo = out_args[0];
int &bar = out_args[1]; // bar is optional argument. is this safe?
...
foo = 5;
if(2 >= nargs)
bar = 10;
...
}
请注意,参数是输出参数,所以我真的很想引用它们。那么,如果我从未真正使用它,那么对 args[1] 进行悬空引用是否安全?
我的猜测是这是安全的,因为我认为引用的实现方式是&
在引用的变量声明中将其视为* const
,并且每当我使用引用时,编译器都会自动为我取消引用指针。即,在引擎盖下,我想我写的东西被翻译成类似的东西
void myFunc(int out_args[], size_t nargs) {
int *const foo = &out_args[0];
int *const bar = &out_args[1]; // bar is optional argument. is this safe?
...
*foo = 5;
if(2 >= nargs)
*bar = 10;
...
}
在这种情况下,我相信代码实际上不会访问它不应该访问的内存,所以如果上面的版本相当于这个,那么我应该没问题,对吧?
编辑:我基本上是在编写一个插件,而我正在使用并且无能为力的 API 可以使用类似的东西调用我的代码
int ret_vals[1]; // only care about 1 return value
myFunc(ret_vals, 1);
或者
int ret_vals[2]; // care about both return values
myFunc(ret_vals, 2);
甚至
myFunc(NULL, 0); // ignore all return values; just marvel at the side effects
我的代码需要在所有情况下都能正常工作。