2017-03-16 48 views
-2

我想定義一個marco來「在控制檯上打印並寫入文件」。 下面是我的代碼,可能有人告訴我爲什麼它會導致「Segmentation fault(core dumped)」。printf造成的宏分段錯誤

#define TRC_DP(fmt, args...) \ 
do {\ 
    FILE * fp = fopen("/home/debug.log","a+");\ 
    fprintf(fp,"TRC_DP(%s:%d):\t" fmt, __func__, __LINE__, ##args);\ 
    printf(fmt, ##args);\ 
    fclose(fp);\ 
}while(0); 
+4

該宏不應以分號結尾。 – pmg

+1

'arg ...'的使用不是標準C.即使你在標準C中有一個可變參數宏,沒有人可以幫助你,除非你提供了導致錯誤的宏的使用示例。 – Peter

+0

你爲什麼要用宏做它?寫一個_function_'int TRC_DP(const char *,...)',並在'myprintf'中使用'vsprintf'變體之一。 –

回答

3

這裏有一些缺陷:

  • TRC_DP(fmt, args...)無效標準C.
  • The icky do-while(0) trick假定沒有拖尾分號。
  • 您必須始終檢查fopen是否成功。

像這樣的東西可能會解決問題:

#define TRC_DP(fmt, ...) \ 
do {\ 
    FILE * fp = fopen("/home/debug.log","a+");\ 
    if(fp != NULL) { \ 
     fprintf(fp,"TRC_DP(%s:%d):\t" fmt, __func__, __LINE__, __VA_ARGS__); \ 
     printf(fmt, __VA_ARGS__);\ 
     fclose(fp);\ 
    } \ 
}while(0) 

然而,這是一些嚴重的醜陋的代碼。如果必須的話,應該用函數替換它,並在運行時連接格式字符串。總體而言,您應儘可能避免使用可變參數函數或宏。它們不僅醜陋而且非常危險。可變參數的存在通常是糟糕的程序設計的強烈表現。

+0

它的工作原理。感謝您的回答和建議! –