2017-12-15 1 views
1

私は警告を取り除く必要があります。その1つは-Wdangling-elseです。ifとマクロがぶら下がっています

#define FOR_EACH_REF(var, container) \ 
    if(bool _cont = true) \ 
     for(our::remove_reference<decltype(container)>::type::iterator _it = (container).begin(); _it != (container).end() && _cont; ++_it) \ 
     if((_cont = false)) {} else \ 
      for(our::remove_reference<decltype(container)>::type::value_type& var = *_it; !_cont; _cont = true) 

私は認めなければならない、私は本当にこのマクロに得ることはありませんので、この警告を解決する方法を、知らない:それは、次のマクロ定義内の場合はダングリングノート。

誰かが抱擁を回避する方法について私に助けてくれますか?

+0

' #define FOR_EACH_REF(var、container)for(auto&var:container) '? – Jarod42

+0

@ Jarod42 jepp、それはポイントです、自動変数と新しいものは、古いコンパイラのサポートが必要です。 –

+2

@OliverFriedrich 'auto'は' decltype'と同じくらい古いです... – Steve

答えて

2

#define FOR_EACH_REF(var, container) \ 
    if (bool _cont = true) \ 
     for(our::remove_reference<decltype(container)>::type::iterator _it = (container).begin(); _it != (container).end() && _cont; ++_it) \ 
     if(!(_cont = false)) \ 
      for(our::remove_reference<decltype(container)>::type::value_type& var = *_it; !_cont; _cont = true) 

C++ 11ので、それも書きやすいだろう:

#define FOR_EACH_REF(var, container) for (auto& var : container) 
+0

驚くほど簡単です。私は明らかに間違った行に警告を解釈した。ありがとうございました。 –

+0

このマクロは、OPのバージョンと同様に、非標準コンパイラ拡張の助けを借りずにC++ 11より前には動作しません。 'decltype'はC++ 11で導入されました。 – Peter

2

他の方法を避けるにはどうすればよいですか?

最も簡単な(推奨しない)オプションは、-Wno-dangling-elseというコンパイラで警告を無効にすることです。

真の解決策は、if/else枝の周りにカッコを追加することです:

#define FOR_EACH_REF(var, container) \ 
    if(bool _cont = true) { \ 
    for(/* ... */) \ 
     if((_cont = false)) {} else { \ 
     for(/* ... */) 

#define FOR_EACH_REF_END }} 

使用法:

FOR_EACH_REF(foo, bar) 
{ 

} 
FOR_EACH_REF_END 

あなたは範囲を反復処理したい場合は、C++ 11その言語の構文が提供されます。このマクロは、この忌み嫌いのあるマクロの代わりに使用する必要があります。

あなたがブロック-ifと elseので、問題は空持つことを避けるために条件を逆かもしれない
関連する問題