に評価されます。 理由を知り、どうすればいいですか?GCCの__func__は、私が働いているプロジェクトで、次のコードを考えると、空の文字列
GCCコンパイラを使用して、Linuxマシンでコンパイルおよびテストされたコード。
に評価されます。 理由を知り、どうすればいいですか?GCCの__func__は、私が働いているプロジェクトで、次のコードを考えると、空の文字列
GCCコンパイラを使用して、Linuxマシンでコンパイルおよびテストされたコード。
__func__
をそのまま使用してください。これはC99以降のC標準の一部です。コンパイラ設定を変更して、少なくともその標準を使用してください。 __func__
最初
static const char __func__[] = "function-name";
を書いた、マクロが、関数本体内の任意の場所に書き込みがその時点でそれを使用するとまったく同じであるような形をとる事前定義された識別子ないこと
注
機能本体の開始ブレースの直後です。
正式には、現在のコードの動作はです。未定義です。 2つの連続したアンダースコアを含むシンボルは、システムによって予約されています。 (これはマクロ名、関数名、変数名が含まれています。)
あなたのコードを提示として期待される結果を提供します(私は必要が含まれており、主な追加のだ一度):私は使用してこれをコンパイル
#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)
イディオムを使用すると便利です。
'some_condition'は本当ですか? – freestyle
'main()'はありませんか? [最小で完全で検証可能な例](http://stackoverflow.com/help/mcve)を投稿してください。 – DevSolar
はい私は確信しています。私は "\ n関数名:\ n"を見ることができますし、このコードをデバッガでデバッグしていて、そのコードが実行されています。 – user2162550