2016-05-31 36 views
-1

我想記號化strize,用宏,功能我們在,重載函數的名稱(使用dlopen()),在C.如何在C中標記和大小__func__宏?

我發現了類似的事情__LINE____FILE__,但它似乎是在與__func__的情況有點不同......

我試過:

#define OVERLOAD2(f) printf("Trying to overload function %s...", #f) 
#define OVERLOAD1(f) OVERLOAD2(f) 
#define OVERLOAD OVERLOAD1(__func__) 

int main() { 
    OVERLOAD; 
} 

不同標準的COM的編譯pilation(c99,gnu11)不會改變結果;而不是印刷:

Trying to overload function main... 

它打印:

Trying to overload function __func__... 

我怎樣才能糾正這些宏?

+0

什麼是'__func__'宏?你在哪看到它的? –

+0

@iharob:http://port70.net/~nsz/c/c11/n1570.html#6.4.2.2p1 – Olaf

+0

「strize」是什麼意思?這甚至是一個字嗎? – Olaf

回答

6

這裏是說,C11草案有關__func__

__func__應由 翻譯被隱含聲明那樣的話,緊隨其後的每個 函數定義的開括號標識,申報

static const char __func__[] = "function-name";

隨着英語新ee __func__,與__FILE____LINE__不同,它不是預處理器宏,因此在預處理階段無法對其進行評估。

但是在你的代碼中,你甚至不需要那樣做。只要改變

#define OVERLOAD2(f) printf("Trying to overload function %s...", #f) 

#define OVERLOAD printf("Trying to overload function %s...", __func__) 

,你可以在__func__標準的描述看,它已經是一個字符串。不需要將它串起來。


如果在編譯時需要將函數名稱作爲「裸詞」,例如,一個隱含的#define __FUNC__ myfunc,你運氣不好。

這是不可能的標準C. GCC還提供__FUNCTION__,但儘管其全大寫的名字,GCC的手冊說:

他們既不是一個宏;預處理器不知道當前函數的名稱 。

MSVC提供了__FUNCTION__作爲一個宏,但它被定義爲一個字符串,你不能去掉雙引號。

只有這樣,周圍是寫自己的預處理程序或重新考慮你的方法

+0

謝謝,沒關係把這個串起來,但是如何標記它呢?我想做'__func __ ## _ foo'之類的事情來調用以當前函數名稱爲前綴的另一個函數。 – Tsigorf

+0

@Tsigorf你不能。我延長了我的回答。 – a3f

+0

好的,非常感謝您的回答。 – Tsigorf