2013-02-22 62 views
0

最近我來到這個代碼:有沒有什麼好理由不使用'define'參數長度可變?

#define LOG(type, str)      printf(str) 
#define LOG1(type, str,arg1)    printf(str,arg1) 
#define LOG2(type, str,arg1,arg2)   printf(str,arg1,arg2) 
#define LOG3(type, str,arg1,arg2,arg3)  printf(str,arg1,arg2,arg3) 
#define LOG4(type, str,arg1,arg2,arg3,arg4) printf(str,arg1,arg2,arg3,arg4) 

代碼最近寫。所以我想它可以用C99編譯。

我的問題是:爲什麼不使用可變參數長度的簡單宏?我們只會將自己限制在LOG宏中,而沒有其他。更不用說,我們不需要添加LOG5,LOG6等。如果我們得到堆棧跟蹤,內存不足,會導致此解決方案有用的任何事情,會不會發生可怕的事情?

我是一個極簡主義者,如果我們可以得到更少的線條越好。但我在這裏錯過了什麼嗎?這是故意的還是錯誤的編碼習慣?

+3

AFAIK如果代碼不是針對C99那麼這是您可以編寫宏的唯一方法。另外:我不知道爲什麼地球上這不是一個功能。 – Jon 2013-02-22 09:03:26

+0

@Jon,假設你不想在發佈版本中登錄,你可以保存整個函數調用事務。不能去'__naked__'。哦,這也將擦除所有這些字符串文字的日誌行 – 2013-02-22 09:10:20

+0

@RomanSaveljev:你必須說服我保存在函數調用*重要*第一。 :-) – Jon 2013-02-22 09:23:45

回答

1

預處理器對可變宏的支持看起來是唯一的好理由。我們在項目LOG, LOG1 etc中已有數十年的歷史,但最近升級至...

作爲每維基百科:

幾個編譯器支持編譯C和C++代碼時的可變參數的宏:GNU編譯器集3.0,[2]的Visual Studio 2005,[3] C++生成器2006,和Oracle Solaris Studio(以前稱爲Sun Studio)Forte Developer 6 update 2(C++版本5.3)。[5]編譯Objective-C時,GCC也支持這些宏。

如果你知道你的平臺,然後用花哨複雜的宏。如果只有很少的支持,那麼事情可能會變得更有趣