質問
免責事項:C ++をしばらく使用していません...
最近、読みやすさを改善するためにC / C ++関数/メソッド宣言を修飾することは一般的ですか?
粗雑な例:
void some_function(IN int param1, OUT char **param2);
IN および OUT の empty 本文で定義されたマクロ(つまり、この例の場合は軽量のドキュメント)もちろん、これは<!> quot; doc comment block <!> quot;と並行して行われることを理解しています。メソッド/関数に関連付けられています。
このトピックがコミュニティに役立つと仮定して、他の例をいくつか教えてください。 お願い上記の例は単なる例であることに留意してください。
解決
このような装飾は好ましくありません。
次のように、const、参照、および定数参照を使用する方がはるかに優れています
void some_function(AClass const ¶m1, AnotherClass ¶m2)
通常、intは参照ではなく値で渡されるため、この例ではAClassとAnotherClassを使用しました。 空のINとOUTを追加すると気が散ることになりそうです。
他のヒント
Windowsヘッダーは実際にこれを正確に行います。完全なリストについては、ヘッダーアノテーションをご覧ください。使用される注釈。たとえば、<!> quot;
DWORD
WINAPI
GetModuleFileName(
__in_opt HMODULE hModule,
__out_ecount_part(nSize, return + 1) LPTSTR lpFilename,
__in DWORD nSize
);
この関数では、hModule
はオプションの入力パラメーター、lpFilename
は最大nSize
文字要素を格納し、(関数の戻り値)+1文字要素を含む出力パラメーターです戻り時、および<=>は入力パラメーターです。
文書化の目的では、適切に記述されたコメントブロックで十分であるため、これらは何の目的にも役立ちません。さらに、一部のドキュメンテーションコメントパーサーには、そのようなことのための特別な構文があります。たとえば、Doxygenを指定すると、次のように記述できます。
/**
* @param[in] param1 ...
* @param[out] param2 ...
**/
void some_function(int param1, char **param2);
これは悪い考えだと思います。特に、だれでもやって来てマクロIN / OUTを定義でき、大きなトラブルに巻き込まれる可能性があるからです。
本当に文書化したい場合は、そこにコメントを入れてください。
void some_function(/* IN */ int param1, /* OUT */ char **param2);
また、戻り値が正常に機能する場合にoutを使用する理由。
また、pass by refとconst refを使用して自分の意図を示したいと思います。また、コンパイラーは、コードがconst正しい場合、意図に対して比較的良い最適化を行います。
void some_function(/* IN */ int const& param1, /* OUT */ char*& param2);
// OK for int const& is kind of silly but other types may be usefull.
C ++ではなく、Cプログラミングを専門的に行ったことはありませんが、少なくともC ++では、パラメーターのタイプは自明です:
void f( std::string const & ); // input parameter
void f( std::string ); // input parameter again (by value)
void f( std::string& ); // in/out parameter
std::string f(); // output
パラメータにコンテキストを追加するコード内ドキュメント作成ツール(doxygen)と一緒に(関数によって期待される値または受け入れられない値、関数が渡されたオブジェクトを変更する方法...
ポインターについて:メソッドインターフェイスの生のポインターを制限する傾向があります。必要に応じて使用できますが、一般的にはスマートポインターを優先する必要があります。この場合も、所有権のセマンティクスはスマートポインターの選択から得られます。shared_ptr<!> lt; <!> gt;希薄な共有責任の場合(または必要な場合)、auto_ptr <!> lt; <!> gt; / unique_ptr <!> lt; <!> gt;単一所有権の場合(通常は、工場、ローカル、またはメンバー属性からの戻り値として)...
使用しようとしています:
- 入力パラメータまたは参照が大きい場合の値
- 出力パラメータのリファレンス
- 呼び出された関数に所有権を与えるポインタ
ほとんどの場合、どちらがINまたはOUTパラメータであるかを簡単に確認できます。もちろん、宣言内の固有名は適切なドキュメントです。
これらのIN、OUTアドオンは迷惑です。
これは見たことがありますが、<!> quot; common。<!> quot;
とは思いません。Win32 API(C ++ではなくC)は同様のものを使用します:
WINADVAPI
BOOL
WINAPI
CreateProcessWithLogonW(
__in LPCWSTR lpUsername,
__in_opt LPCWSTR lpDomain,
__in LPCWSTR lpPassword,
__in DWORD dwLogonFlags,
__in_opt LPCWSTR lpApplicationName,
__inout_opt LPWSTR lpCommandLine,
__in DWORD dwCreationFlags,
__in_opt LPVOID lpEnvironment,
__in_opt LPCWSTR lpCurrentDirectory,
__in LPSTARTUPINFOW lpStartupInfo,
__out LPPROCESS_INFORMATION lpProcessInformation
);
Visual C ++ 2005以降のコンパイラの場合、これらは実際には__$allowed_on_parameter
などの宣言にマップされ、コンパイル時にチェックされます。
これよりも悪いのは、Pascal devによって書かれたCプログラムでずっと前に見られたものです:
#define begin {
#define end }
int main( int argc, char* argv[] )
begin
...
end
私はこれを見たことがありません。このような情報をコメントに入れる方が良いと思います。
パラメータタイプの情報に加えて、接頭辞i_、o_、io_の使用を見ました:
void some_function(int i_param1, char** o_param2, int& io_param3);