181

お使いのC++コンパイラがそれらをサポートしていると仮定して、ログとデバッグの目的で、を使用しない特別な理由はありますか?__FILE____LINE____FUNCTION__

私は主に、ユーザーに誤解を招くデータを提供すること(たとえば、最適化の結果として誤った行番号や機能を報告すること)、または結果としてパフォーマンスに影響を与えることに関心があります。

基本的に、私は信頼できますか__FILE____LINE__そして常に正しいこと__FUNCTION__をすることができますか?

4

6 に答える 6

214

__FUNCTION__非標準で__func__あり、C99 / C++11に存在します。他の(__LINE____FILE__)は問題ありません。

__FUNCTION__常に正しいファイルと行を報告します( /を使用することを選択した場合は機能します__func__)。最適化はコンパイル時のマクロ拡張であるため、非要因です。パフォーマンスに影響を与えることはありません。

于 2009-02-27T23:28:58.787 に答える
32

参考までに: g++ は非標準の __PRETTY_FUNCTION__ マクロを提供しています。C99 __func__ については、今まで知りませんでした (Evan さん、ありがとうございます!)。__PRETTY_FUNCTION__ が追加のクラススコープに使用できる場合、私はまだ __PRETTY_FUNCTION__ を好むと思います。

PS:

static string  getScopedClassMethod( string thePrettyFunction )
{
  size_t index = thePrettyFunction . find( "(" );
  if ( index == string::npos )
    return thePrettyFunction;  /* Degenerate case */

  thePrettyFunction . erase( index );

  index = thePrettyFunction . rfind( " " );
  if ( index == string::npos )
    return thePrettyFunction;  /* Degenerate case */

  thePrettyFunction . erase( 0, index + 1 );

  return thePrettyFunction;   /* The scoped class name. */
}
于 2009-02-28T13:37:40.070 に答える
8

個人的には、メッセージのデバッグ以外の目的でこれらを使用するのは気が進まない。私はそれを行いましたが、そのような情報を顧客やエンドユーザーに見せないようにしています。私の顧客はエンジニアではなく、コンピューターに精通していないこともあります。私はこの情報をコンソールに記録するかもしれませんが、私が言ったように、デバッグビルドまたは内部ツールを除いてしぶしぶ。しかし、それはあなたが持っている顧客ベースに依存すると思います。

于 2009-02-27T23:30:38.267 に答える
4

私はいつもそれらを使用しています。私が唯一心配しているのは、ログ ファイルで IP を公開することです。関数名が本当に優れている場合は、企業秘密を発見しやすくしている可能性があります。これは、デバッグ シンボルを同梱するようなもので、見つけるのが難しくなります。ケースの 99.999% では、何も悪いことはありません。

于 2015-02-05T05:36:27.373 に答える