私には一種の奇妙な願いがあります。そこにあるコンパイラまたは言語拡張機能でこれが許可されているかどうかはわかりません。
次のように、関数呼び出し内で変数を宣言できるようにしたいと考えています。
int test(int *out_p) {
*out_p = 5;
return 1;
}
int main()
{
if (int ret = test(int &var)) { // int var declared inside function invocation
fprintf(stderr, "var = %d\n", var); // var in scope here
}
return 0;
}
var のスコープは ret のスコープに従うためです。別の例として (私が現在取り組んでいるプロジェクトから)、私は
cmd_s = readline();
int x, y, dX, dY, symA, symB;
if (sscanf(cmd_s, "placeDomino:%d %d atX:%d y:%d dX:%d dY:%d",
&symA, &symB, &x, &y, &dX, &dY) == 6) {
do_complicated_stuff(symA, symB, x, y, dX, dY);
} else if (sscanf(cmd_s, "placeAtX:%d y:%d dX:%d dY:%d", &x, &y, &dX, &dY) == 4) {
do_stuff(x, y, dX, dY);
/* symA, symB are in scope but uninitialized :-( so I can accidentally
* use their values and the compiler will let me */
}
そして、私は書きたいと思います
cmd_s = readline();
if (sscanf(cmd_s, "placeDomino:%d %d atX:%d y:%d dX:%d dY:%d",
int &symA, int &symB, int &x, int &y, int &dX, int &dY) == 6) {
do_complicated_stuff(symA, symB, x, y, dX, dY);
} else if (sscanf(cmd_s, "placeAtX:%d y:%d dX:%d dY:%d", int &x, int &y, int &dX, int &dY) == 4) {
do_stuff(x, y, dX, dY);
/* Now symA, symB are out of scope here and I can't
* accidentally use their uninitialized values */
}
私の質問は、これをサポートするコンパイラはありますか? 正しい方法でこすれば、gccはそれをサポートしますか? これを含む C または C++ (ドラフト) 仕様はありますか?
編集: 私の最初のコード例では、私の int ret の宣言も C99 では役に立たないことに気付きました。私はforループに甘やかされていると思います。私もその機能が欲しいです。想像
while(int condition = check_condition()) {
switch(condition) {
...
}
}
またはそのようなもの。