2017-02-09 83 views
4

我只是做了自己的醜:我想跟蹤進程的執行,爲了做到這一點,我寫了一個函數trace(),其中包含下面的代碼行:如何找到父函數的__FUNCTION__,__LINE__和__FILE__?

printf("%s[%s:%d], %s\n", __FUNCTION__, __FILE__, __LINE__, s_message); 

我希望看到我在哪個函數中,哪個文件和該文件中的哪一行,但是我只是看到了我編寫'trace()'函數的那個​​文件的信息。

是否有可能,是否有一些#define左右,告訴C編譯器從調用函數的父級中提取宏?

+8

使'trace()'成爲一個宏。 – tkausl

+0

將trace作爲一個宏將是明顯的解決方案。如果你不知道如何,請閱讀宏如何工作和定義。並且不要垃圾郵件標籤! C++不是C! – Olaf

+0

相關:http://stackoverflow.com/a/18658873/694576 – alk

回答

6

你需要將其包裝在一個宏,例如:

void _trace(char const *function, char const *file, long line, char const *message) { 
    printf("%s[%s:%ld], %s\n", function, file, line, message); 
} 

#define trace(message) _trace(__FUNCTION__, __FILE__, __LINE__, (message)) 
+2

這是宏的一個非常重要的用途。 –

+0

因爲在某些情況下'__LINE__'可以擴展爲'long',所以'line'參數的類型應該是'long',格式應該是''%ld「'。 –

+0

@JensGustedt:好點,編輯。我猜如果'int'是16位,這是要記住的。特別是生成的代碼可以輕鬆地打到每個文件32k loc。實際上,我猜它也可能是'unsigned'。 – Thomas

1

正如其他人所指出的,你應該有一個宏。 原因是在編譯的預處理階段所有3個使用的宏都被擴展了,並且它們將被相應的信息所替代,就像它遇到的一樣。這就是您的實際產出是trace()實施的原因。

您可以將您當前的trace()實施更改爲接收函數名稱,文件和行的const char *。然後,有一個宏,比如mTrace,它擴展爲調用初始跟蹤函數,正好傳遞__FUNCTION__,__FILE__, __LINE__。當然,您的mTrace可能會得到另一個參數,即您想添加的實際消息,並將其傳遞給trace()

Hth