コードのにおい56 -プリプロセッサ


私たちのコードは異なった環境、オペレーティングシステムで異なって振る舞うことを望みます.したがって、コンパイル時に決定をすることは最高の決定です.

問題

  • 読みやすさ
  • 早熟な最適化
  • 不必要な複雑さ
  • のデバッグ

    解決策

  • すべてのコンパイラディレクティブを削除します.
  • 異なる振る舞いをしたいなら、オブジェクト
  • でそれをモデル化してください
  • パフォーマンスペナルティがあると思うなら、早めの最適化を行う代わりに、重大なベンチマークを作ります.
  • サンプルコード


    間違い


    #if VERBOSE >= 2
      printf("trace message");
    #endif
    


    if (runtimeEnvironment->traceDebug()){
      printf("trace message");
    }
    
    ## even better with polymorphism and we avoid annoying ifs
    
    runtimeEnvironment->traceDebug("trace message");
    
    

    検出


    これはいくつかの言語によって促進される統語的な指示であるので、それは検出して、本当の行動と取り替えやすいです.

    タグ

  • コンパイラ
  • Metaprogramming
  • 結論


    複雑さの余分な層を追加するとデバッグが非常に困難になります.メモリとcpuが乏しかったときにこの手法を使用した.今日、我々はクリーンなコードを必要とし、我々は過去に埋もれた早めの最適化を残す必要があります.
    Bjarne Strroustrupは、C +のデザインと進化の彼の本では、前に作成したプリプロセッサのディレクティブを後悔します.

    関係




    詳しい情報




    % [ http://www.parashift.com/c++-faq-lite/newbie.html#faq-29.8 ]
    % [ https://en.wikipedia.org/wiki/C_preprocessor ]
    #ifdef Considered Harmful

    クレジット


    CDCUnsplashによる写真

    C++ is designed to allow you to express ideas, but if you don't have ideas or don't have any clue about how to express them, C++ doesn't offer much help.


    Bjarneストールストラップアップ


    この記事はCodesmellシリーズの一部です.