2010-06-24 32 views
0

在我的項目(因技術原因不能依賴於任何外部庫或第三方來源)我已經設置了以下test.h如何使printf()正確地從宏內打印二進制blob?

static int rc = 0; 
#define TESTCASE(x) if (x) {} \ 
         else \ 
         { \ 
          rc += 1; \ 
          printf("FAILED: " __FILE__ ", line %d - " #x "\n", __LINE__); \ 
         } 

也能正常工作的大部分時間 - 如果測試用例評估爲真,沒有任何反應。如果測試用例評估爲false,則打印測試用例包括文件名和行號。

但是,當測試用例包含字符串文字時,TESTCASE宏中的printf()堅持將字符串字面解釋爲格式字符串的一部分(這對於某個測試用例來說是致命的)。

現在我正在想方設法讓printf()逐字打印x(測試用例)中的任何內容,但我已經空了。最接近的是使用%c打印固定數量的字符,並將文本(#x)作爲參數傳遞給printf() - 但我無法弄清楚如何確定#x的大小,特別是如果它包含零字節(其中排除任何使用strlen())。

困惑,無所適從。幫幫我?

回答

3

那麼如何使用%s作爲格式,然後將字符串化測試用例作爲參數傳遞,就像您對行號所做的那樣?

printf("FAILED: %s, line %d - %s\n", __FILE__, __LINE__, #x); 

#參數轉換爲正確的雙引號分隔字符串,所以沒有什麼能阻止你通過這個字符串作爲參數傳遞給printf ...

(你永遠不應該使用任何價值沒有硬編碼爲printf的格式字符串:這大部分時間都提高了地獄)

+0

一個很好的第一個appriach,但是如果#x中的字符串文字包含零字節呢? – DevSolar 2010-06-24 09:36:13

+0

我不認爲這是可能的:零字節沒有表示,它在C源文件中無效,因此不能出現在你的測試用例中。 (或者在你的問題中'TEST_CASE'宏的定義是錯誤的),請記住'#'預處理器運算符是一個字符串化器,它會將'abc'轉換爲''abc「'在宏參數中直接出現的字符串。 – 2010-06-24 09:48:42

+0

我在這裏輸入了一半的內容「嘿,我意識到'\ 0'是零字節的*表示*,而不是事物本身,我可以隨時將字符串'\ 0'寫入字符串'。 AAaaargh ......我的大腦一半已經睡着了。當然,你絕對是對的。 – DevSolar 2010-06-24 09:51:03