私は、呼び出し元がポインターの配列と配列の長さを渡す 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
私のコードはすべての場合に機能する必要があります。