6

私が使用しているサードパーティ製のオープンソース アプリケーションは、奇妙な動作をします。これが間違っている/悪い/忌まわしい/などだと思うかどうか、またはこれを行う正当な理由があるかどうかについて、あなたの意見を聞きたい.

簡単に言えば、#include pre-proc ディレクティブを使用して、コードのフラグメントを含む「ヘッダー ファイル」をインクルードします。関数のプロトタイプではありません。インライン関数ではありません。コードの一部のみ。

簡単な例を次に示します。最初に main.cpp ファイル:

#include <iostream>
//Other "normal" includes here...

int main(int argc, char *argv[]) {

  cout << "Initializing program..." << endl;
  #include "parseArgs.h"

  // ... remainder of the program

  cout << "Exiting." << endl;
  return 0;
}

parseArgs.h ヘッダー ファイル内には、小さなコード フラグメントがあります。これはまさに parseArgs.h ファイルにあるものだけであることに注意してください。これは関数の一部ではありません。インクルード ガードはなく、次の 4 行だけです。

argList args(argc, argv);
if(!args.valid()) {
  cout << "Invalid arguments.";
  exit(1);
}

実際のプログラムには、これらの #include ディレクティブがいくつかあり、それぞれが別の小さなタスクを実行します。

危険でクレイジーに思えます。これらを関数として記述して呼び出さない理由がわかりません。

あなたのアイデアや意見は?

4

5 に答える 5

9

ここでOpenFOAMについて話していると思います。これらのコード スニペットが解決する問題は、OpenFOAM の多くのアプリケーションが必要とするボイラープレート コードの重複を回避することです。関数内で宣言された変数はそのスコープに対してローカルであるため、このコードを関数に入れても問題は解決しません。おそらく、これらの変数をメンバーとして含む基本クラスのスキームを考え出すことができます。しかし、それは実際には何も解決しない間接的なレイヤーを追加するだけです。あなたはまだ変数名に依存しています(または、きれいにしたい場合はゲッター名)。

個人的には、この慣行が良いか悪いかについては未定です。それはその通りであり、OpenFOAM コード文化 (または必要に応じてローカル用語) の一部です。一見すると驚くかもしれませんが、すぐに慣れます。

ただし、OpenFOAM アプリケーション/拡張機能を自分で開発している場合を除き、この方法を使用しないことを強くお勧めします。OpenFOAM は、事実上何百もの実行可能ファイルが含まれているという点で、ややユニークです。これらの実行可能ファイルには、他の方法では保守が困難なオーバーラップするボイラープレート コードが必要です。そのような状況にない場合は、それをしないでください。

于 2013-03-11T11:11:30.060 に答える
0

私はそのようなことを「クレイジー」とは呼びません。「珍しい」、「理解しにくい」、「予期しない」、したがって「読みにくく、デバッグし、維持しにくい」という用語を使用します。または単に「WTF」-コード品質を低下させます

決してそれをしないでください。関数を使用します。または、本当にそうしなければならない場合は、まったく同じことを実行するが、人々がはるかに精通しているマクロを使用します。はい、マクロは悪いものであり、デバッグに関してはピタになる可能性があります。しかし、これはもっと悪いことです。

編集:明確にするために:私はマクロが好きではありません。可能な限り避けます。多くの場合。関数、テンプレート、その他何でも使用できます。しかし、「マクロまたはWTF- #include」になると、マクロを使用します。

于 2013-03-11T11:06:27.643 に答える
0

このタイプの使用法には理由があるかもしれないので、私はそれを「クレイジー」と呼ぶのをためらってい#includeます. 問題は、これらの理由を理解し、これが与えられたコンテキストで最善のアプローチであるかどうかを判断することです. 私が想像できる理由は、コードが手書きではなく何らかの方法で生成されていることです。

OTOHは奇妙に思えますし、特定のコード臭があります. また、理由が正確に何であるかを知りたいと思っています。理由がない、または間違っていることが判明した場合は、リファクタリングの良い候補です。

于 2013-03-11T10:44:31.293 に答える
0

これは非常に厄介で、関数を書く方がうまくいくと思います。

これは、SO で「c++ にヘッダー ファイルを 2 回インクルードすることが有効なのはなぜですか?」 興味深い答えが見つかるかもしれません。バグやその他の問題を修正するのは苦痛で時間がかかると思うので、この方法でコードを書くことは決してありません。

于 2013-03-11T10:58:42.657 に答える