0

Google C++ スタイル ガイド ( http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Preprocessor_Macros ) は次のように述べています。

「マクロを使用してコードを条件付きでコンパイルする代わりに...まあ、それはまったくしないでください」

次のような機能があるのはなぜそんなに悪いのですか

void foo()
{
    // some code

#ifdef SOME_FUNCTIONALITY
    // code
#endif

    // more code
}

?

4

2 に答える 2

4

リンク先のドキュメントで彼らが言うように:

マクロは、表示されるコードがコンパイラーが表示するコードと同じではないことを意味します。特にマクロにはグローバル スコープがあるため、これにより予期しない動作が発生する可能性があります。

条件付きコンパイルが 1 つしかない場合はそれほど悪くはありませんが、次のような入れ子になったものを使い始めると、すぐに複雑になる可能性があります。

#if PS3
  ...
#if COOL_FEATURE
  ...
#endif
  ...
#elif XBOX
  ...
#if COOL_FEATURE
  ...
#endif
  ...
#elif PC
  ...
#if COOL_FEATURE
  ...
#endif
  ...
#end
于 2013-10-05T01:28:34.507 に答える
1

それに反対するいくつかの議論があると思います:

  • #ifdefC++ 式/ステートメント/関数/クラス構文を横断します。つまり、goto柔軟性がありすぎて、信頼して使用できないということです。

  • が定義されていない場合、 のコードが// codeコンパイルされるとします。SOME_FUNCTIONALITY次に、 a を使用ifstatic const boolてコンパイラを信頼し、デッド コードを排除します。

  • が定義されていない場合、 のコードがコンパイルされ// code ないとします。SOME_FUNCTIONALITY次に、有効なコードと無効なコードが混在し、関連するコードと無関係なコードが混在する犬の朝食を作成しています。これは、2 つのケースをより完全に分離することで改善される可能性があります。

  • プリプロセッサはひどい間違いでした。Java は C や C++ よりもはるかに優れていますが、金属の近くをいじりたい場合は、それらで立ち往生しています。#キャラクターが存在しないふりをしてみてください。

  • 明示的な条件はひどい間違いです: ポリモーフィズム ベイビー!

  • Google のスタイル ガイドでは、特にテストについて言及してい#ifdefます。これは面倒です。サポートされているすべての構成に対してテストできる単一の実行可能ファイルを優先する必要があります。もちろん、同じ反論が論理的には にも当てはまりますstatic const bool。一般に、静的な依存関係を避けると、テストが容易になります。「依存関係」がブール値だけにある場合でも、それらを注入することをお勧めします。

個人的には、特定の状況下での特定の仕事には、厄介なコードが最適な場合があると個人的には思います。しかし、Google C++ スタイル ガイドは、最善の判断を下すように指示するものではありません。これは、統一されたコーディング スタイルを設定し、作成者が気に入らない、または信頼していない言語機能を削除するというビジネスです。

于 2013-10-05T01:37:20.310 に答える