2012-09-08 103 views
5

我對C++比較陌生,我正在上一個類。我們的班級被分配了一個實驗室,我的老師說實驗室的寫作有點難以理解;但是,他沒有對實驗室報告做任何修改。所以,我遇到了實驗室的這一部分:定義一個預處理器宏

定義一個預處理宏

長期以來的慣例大寫宏名,而這個宏的名稱必須是TRACE_FUNC。該宏具有單個參數,當您將該宏應用於代碼時,該符號將被函數名稱替換。宏觀的開始是這樣的:

#define TRACE_FUNC(symbol) replacement-text` 

和預處理器將無處不在替換替換文本的TRACE_FUNC(符號)字符串中的源代碼存在,並且喂符號設置成替代品。

注意:#define語句必須全部在單個邏輯行上。爲了保持長度的可管理性,可以在行尾加一個反斜槓來轉義換行符;這將使預處理器保持高興,同時允許跨多行跨越定義。

對於本練習,替換文本必須是完整的語句,包括終止分號。

替換文本必須是一個輸出語句,該語句將打印符號,後跟調用的文本()。和標準輸出的換行符。您可以從warning.cpp源文件複製和修改其中一個輸出語句。

warning.cpp只是一個我們正在使用的文件,而TRACE_FUNC被放置在一個頭文件中。

所以,我讀了幾次,我不是100%確定它在問什麼。從一種方式看,它似乎要求我創建一個名爲TRACE_FUNC的宏。如果以另一種方式來看,它會要求我使用宏TRACE_FUNC。所有這一切都很好,但我不知道如何使用TRACE_FUNC,我無法在任何地方找到任何文檔,也不知道如何創建宏。當我尋求幫助時,我的老師只是說。而不是那些非常有用的,因爲它是一個非常曲折,混亂的答案,沒有解釋TRACE_FUNC究竟是什麼。

基本上,我老師所說的全部內容都是TRACE_FUNC內的符號需要是源代碼中某個函數的名稱。舉個例子,假設我們在警告中有一個函數foo(),那麼從他的解釋中,符號應該是foo()(或者foo,我也不確定)。另外,在替換文本中,如果我將#放在符號的前面,顯然名稱本身將被替換。我認爲應該表示預處理器指令。爲什麼我應該在這裏使用它?

無論如何,做我的老師所說的幾乎沒有做什麼。這也不行

#define TRACE_FUNC(foo()) #foo() called. ;

也不該行

#define TRACE_FUNC(foo) #foo() called. ;

更換任何文字,我敢肯定是#define指令的操作。所以我必須以錯誤的方式來應用我的老師所說的話,但我不知道爲什麼這是錯誤的或者如何解決它。

所以,我的問題。 TRACE_FUNC實際上是一個宏,如果是的話,是否有任何文檔可以閱讀?或者我應該創建TRACE_FUNC,如果是的話,我應該怎麼做?

回答

6

哇,什麼垃圾!你應該學習C++,而不是錯綜複雜的預處理器。

這就是你應該做的,但爲什麼有人會猜測。

#define TRACE_FUNC(sym) std::cout << #sym << "() called\n" 

void foo() 
{ 
    TRACE_FUNC(foo); 
    ... 
} 

我假設有來自warning.cpp使用std::cout例子,如果沒有,那麼你將有以上,以適應任何你在warning.cpp找到。

這個想法是每個函數都以使用TRACE_FUNC宏開始,因此您可以跟蹤代碼的執行情況。爲什麼教授認爲這對於新手來說是一個好主意,這是我無法想象的。即使這是一個好主意,你可能會發現自己的細節甚至是愚蠢的。

我可以改善上面的宏,但這可能會混淆更多,所以我不會。現在我只想做教授說的話,但忽略它。希望他能找到值得學習的東西。

+0

謝謝!這比我的老師說的要清楚得多。 – FoolishOrpheus

+0

另請參閱http://stackoverflow.com/a/257425/1689451關於如何定義函數宏。 –

-1

這裏有一個例子:使用輸出中打印功能在您的libray來代替這裏的標準函數printf

#define TRACE_FUNC(sym) printf("%s() called", #sym); 

使用它作爲

TRACE_FUNC(printf) 

輸出應該是

printf() called 

您的實際任務是以定義的格式打印符號。所以你需要在你的#define中使用printf或類似的函數。