2017-01-29 3 views
8

これはまだ重複していないとは思いませんが、C++専用のより複雑なシナリオが議論を支配しているようだから簡単に答えを見つけることはできませんCの一時的な(複合リテラル)パラメータのアドレスを取る

C99の関数呼び出しのパラメータリストで作成された一時的なアドレスを取得することはできますか?例えば

init_listまたはinit_desig_initのようなものを次のように

typedef struct { 
    int x; 
    int y; 
} point_t; 

int manhattan(point_t *p) { 
    return p->x + p->y; 
} 

int init_list() { 
    return manhattan(&(point_t){1, 2}); 
} 

int init_desig_init() { 
    return manhattan(&(point_t){.x = 1}); 
} 

ビッグ3 seem to compile it OKが、私は実際には、一時の寿命がで延長されることを説明するの参照を見つけることができませんでした少なくとも関数呼び出しを通して。


それはMM以下によって回答に基づいて、結局のところ、私は一時上の情報を探していたので、この特定の正しいCの用語ながら、私の検索の問題の一部であったが、初期化構成は複合語リテラルです。

私はそれをMSVCを尊重して「大きなクロスプラットフォーム3」と呼ぶべきですが、実際は「Cコンパイラgodboltがサポートしています」という意味です。

+1

あなたが得た答えは良いですが、心に留めておく価値ある小さな落とし穴がありますより包括的なリテラルの使用を開始するとき:http://stackoverflow.com/questions/34880638/compound-literal-lifetime-and-if-blocks – Art

+0

@Art - 非常に良い点。 C++の一時リテラルとC++の複合リテラルの異なる生涯規則を覚えようとするにはまだ十分ではなかったのですが... – BeeOnRope

答えて

7

(point_t){1, 2}は「一時的」ではありません。複合リテラルです。 (C++のトークンの同じシーケンスは異なる意味を持ち、これらの2つの言語を互いに混同しないでください)。

複合語は左辺値なので、単項式&演算子を使用することは正当です。貯蔵期間は、C11 6.5.2.5/5によって覆われている。

リテラル化合物は、機能の体外発生した場合、オブジェクト は静的記憶域期間を有します。それ以外の場合は、囲みブロックに関連付けられた自動記憶期間があります。

ので、このコードは正しく、リテラル化合物は、それがで宣言された関数の最後まで、既存を保持します。

+0

ありがとうございます。私の「一時的な」使用は、なぜこのような厳しい時期に、なぜこれについての詳細を探していたのかを部分的に説明します。さらに参考にするには、[gcc doc on _compound literals_](https://gcc.gnu.org/onlinedocs/gcc/Compound-Literals.html)を参照してください。 – BeeOnRope

関連する問題