2016-08-19 6 views
-4

ファーストライン機能の目的は何ですか?すべての関数の先頭に定数のcharポインタが使用されるのはなぜですか?

void foo::bar() 

{ 

    const char * function_name = "bar"; // <<< WHY?? 

    /* Code */ 

    /* More Code */ 

    /* Waiting for function_name to be used !!!*/ 

    /* Wow it is totally useless?*/ 
    return; 
} 

`

これは、経験豊富な人々によって設計されたコード内のすべての場所を、印刷するなしのマクロを使用しています。それはどんなトリックも運びますか?エンタープライズコードを書き込み、誰かが、私はかなり頻繁にそのように構造を見てきたよういえば

const char * function_name = "bar"; 
Loggers::get_logger() << "Entered function " << function_name << "\n"; 

+2

これは一般的な使用場所の例を表示できますか?おそらくオープンソースプロジェクトへのリンクですか?私はロギングのために** **使用されている場合にのみこれが行われていることを見てきました。したがって、ログを持たない小さな関数にはまだ存在することがあります。 – BoBTFish

+4

これは、そこに置く人だけが答えることができる質問です(私はデバッグの助けと思っていますか、存在していたマクロに関連しています*) –

+0

@BoBTFish残念ながら、これはプロプライエタリなコードです。私は "__FUNCTION__"のように表示されるデバッグマクロを探しましたが、何もありません。使用されていないので、コンパイラはO1自体で完全に自信を持って削除しました。コードを扱っている人はすべて同じ* culture *に従っています* –

答えて

2

これは、1つの点で、関数はこのように見えたコードを持っていたことが可能です。おそらく、ロギングが削除されたか、またはメタプログラミングテンプレートの一部ですが、文字列を格納するためにconst char *を使用していると考えても、コードはかなり古いと推測する必要があります。

いずれにしても、C++固有の設計選択肢であるこのコードについては何もありません。決定的な回答が必要な場合は、コードを書いた特定の担当者に質問する必要があります。

+0

特定の文字列リテラルでは決して何もしませんが、const char *を取ることができるAPIにそのまま渡してから、それを参照してください'const char *'変数はオーバーヘッドのグロブをカットします。1つだけあれば大したことではありませんが、1つの関数ごとに1つがあれば、必要のない数千の静的コンストラクタになる可能性があります。 – zwol

3

私は、どこかで、このプログラムのヘッダファイルが含まれていることをカスタムassertマクロ読みを疑うこれをサポートするために

#define fooco_assert(expr) \ 
    ((void) ((expr) || \ 
    fooco_assert_failed(#expr, __FILE__, __LINE__, function_name))) 

extern int fooco_assert_failed(const char *expr, const char *srcfile, 
           int lineno, const char *fnname); 

のようなもの、作者はそれでfunction_nameの定義があるだろうというスタイルルール作らすべての単一機能の始めから、が利用可能かどうかを考えずに、将来的に必要に応じてfooco_assertにコールを追加することができます。ご存じのように、実際に使用されていない限り、コンパイラはコンパイルされたプログラムに文字列を出力することはありません。効率的な問題ではありません。

確かにですが、プログラムの読み込みや編集にはスピードバンプです。 C++ 11コンパイラは、現在の関数の名前を保持している__func__と呼ばれる定義済みの変数を提供します。これは代わりに使用できます。この機能は、1999年にC標準に追加されました。多くのC++コンパイラは、すぐにそれを採用しました。他のC++コンパイラには__func__はありませんが、それと同等の独自拡張があります。 __FUNCTION__。これらは、ではなく、のマクロであることに注意してください。

#ifndef __func__ 
#define __func__ "<unavailable>" 
#endif 

は、__func__が利用可能かどうかを検出しません。代わりに、このようなことをしなければならないでしょう(私の頭の上から離れて、全くテストされていない):

#if __cplusplus >= 201103L || __GNUC__ >= 3 
// __func__ is available in C++11, and in GCC >= 3.0 
#elif _MSC_VER || __GNUC__ 
// pre-C++11 MSVC and ancient versions of GCC call this 
// feature __FUNCTION__ instead 
#define __func__ __FUNCTION__ 
#elif ... 
// ... etc etc for all other compilers you care about 
#else 
#define __func__ "<unavailable>" 
#endif 
+0

驚いたことに__func__はC++ 11でのみ導入されました! –

+0

@ P.P。 1999年に* C *に追加されましたが、C++標準は1998年から2011年の間にわずかな改訂版しか受け取りませんでした。多くのC++コンパイラは事前にそれを取り上げました。私はそれについて何かを追加します。 – zwol

関連する問題