2016-12-05 3 views
1

に評価されます。 理由を知り、どうすればいいですか?GCCの__func__は、私が働いているプロジェクトで、次のコードを考えると、空の文字列

GCCコンパイラを使用して、Linuxマシンでコンパイルおよびテストされたコード。

+0

'some_condition'は本当ですか? – freestyle

+2

'main()'はありませんか? [最小で完全で検証可能な例](http://stackoverflow.com/help/mcve)を投稿してください。 – DevSolar

+0

はい私は確信しています。私は "\ n関数名:\ n"を見ることができますし、このコードをデバッガでデバッグしていて、そのコードが実行されています。 – user2162550

答えて

5

__func__をそのまま使用してください。これはC99以降のC標準の一部です。コンパイラ設定を変更して、少なくともその標準を使用してください。 __func__最初

static const char __func__[] = "function-name";を書いた、マクロが、関数本体内の任意の場所に書き込みがその時点でそれを使用するとまったく同じであるような形をとる事前定義された識別子ないこと

機能本体の開始ブレースの直後です。

正式には、現在のコードの動作はです。未定義です。 2つの連続したアンダースコアを含むシンボルは、システムによって予約されています。 (これはマクロ名、関数名、変数名が含まれています。)

+0

私はあなたが「2つの連続したアンダースコアを含む任意のマクロ名*」と言っていると思います。 –

+1

マクロ名、関数名、および変数名をさらに強くすることを申し訳ありませんでした。 – Bathsheba

+0

@TobySpeight:ローカル変数 'int __func__'に名前を付けるとどうなりますか? – AndyG

1

あなたのコードを提示として期待される結果を提供します(私は必要が含まれており、主な追加のだ一度):私は使用してこれをコンパイル

#include <stdio.h> 

#ifdef WIN32 
#define __FUNCNAME__ __FUNCTION__ 
#else 
#define __FUNCNAME__ __func__ 
#endif 

/* My definitions */ 
#define MAC() \ 
    MAC1() 

#define MAC1() \ 
    myPrintFunction(__FUNCNAME__) 

void myPrintFunction(const char * functionName) 
{ 
    printf("\n func name: %s \n",functionName); 
} 

int main() 
{ 
    MAC(); 
} 

gcc -std=c11 -Wall -Wextra -Wwrite-strings -Wno-parentheses -Wpedantic -Warray-bounds警告なし。

あなたが実際にコンパイルする完全な(しかし、最小限の)例を実際に投稿してください。

また、文をマクロとして書くときに、予期せぬ拡張が制御フローを変更しないように、do {...} while (0)イディオムを使用すると便利です。

関連する問題