ライブラリの関数を呼び出したい(変更できない)
void function(int* i, char* c);
int
とをその場で定義する関数を呼び出す方法はありchar
ますか?
つまり、次のようなことをしています
function(&1, &'v');
それ以外の
int int_1 = 1;
char char_1 = 'v';
function(&int_1, &char_v);
これにより、コードの長さが大幅に短縮され、読みやすさが向上します。
ライブラリの関数を呼び出したい(変更できない)
void function(int* i, char* c);
int
とをその場で定義する関数を呼び出す方法はありchar
ますか?
つまり、次のようなことをしています
function(&1, &'v');
それ以外の
int int_1 = 1;
char char_1 = 'v';
function(&int_1, &char_v);
これにより、コードの長さが大幅に短縮され、読みやすさが向上します。
他の人が指摘したように、答えはノーです...
オーバーロードすることでシミュレートできますfunction
:
void function(int i, char c)
{
function(&i, &c);
}
だから今、あなたは書くことができますfunction(1, 'v')
はい、できます。
function((int*)&(const int &)1, (char*)&(const char &)'v');
また、関数呼び出し後にポインターが逆参照されない限り、完全に合法です。これは、関数呼び出しが存在する完全な式に等しい一時的な寿命があるためです。
それらを関数で使用して、問題なくデータを変更できます。
実例。_ 関数 'function' が定義されていないことに注意してください。この例は、そのような関数呼び出しが完全に有効であることを示しているだけです。
注: この構文の複雑さは、一部の「C++」セキュリティ対策によるものです。結局のところ、名前のないデータへのポインターを渡すことはめったにありません。ただし、これは、この構造が違法または UB であることを意味するものではありません。
FISOCPPの答えは素晴らしいですが、一時的な作成方法が好きではありません。
複合ラテラル構文を使用して、この方法で実行できます。
function(&(int){1}, &(char){'v'});
一時的に使用する方法はどちらも、アドレスを取得しようとすると gcc が警告を発しますが、完全に定義された有効なコードです。
興味深いことに、複合ラテラルには C++ の一時ストレージではなく C の自動ストレージがあるため、C99 モードでコンパイルされた場合でも警告は表示されません。