C 是否有充分的理由不使用';定义';参数长度可变?
最近我遇到了以下代码:C 是否有充分的理由不使用';定义';参数长度可变?,c,c-preprocessor,variadic-functions,C,C Preprocessor,Variadic Functions,最近我遇到了以下代码: #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,
#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
macro上,什么也不做。更不用说,我们不必添加LOG5
,LOG6
,等等。如果我们得到堆栈跟踪,内存不足,或者有什么可以使此解决方案有用的东西,会发生可怕的事情吗
我是一个极简主义者,如果我们的线条越少越好。但我是不是遗漏了什么?这是故意的还是不好的编码实践?在我看来,对可变宏的预处理器支持是唯一好的理由。几十年来,我们一直在项目中使用
日志、LOG1等
,但最近确实升级到了…
根据维基百科:
< >编译C++和C++代码时,几个编译器支持变量参数宏:GNU编译器集合3、[2 ] Visual Studio 2005、[3 ] C++ Builder 2006和Oracle Solaris Studio(以前Sun Studio)Forde开发者6更新2(C++版本5.3)。
如果你知道你的平台,那就使用别致的可变宏。如果支持的代码很少,那么事情可能会变得更有趣。AFAIK如果代码不是针对C99的,那么这是编写宏的唯一方法。另外:我不知道这到底为什么不是一个函数。@Jon,假设你不想在发布版本中使用日志,你可以保存整个函数调用事件。让我们不要去
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。哦,这也会删除日志中所有的字符串文字lines@RomanSaveljev:您必须让我相信,节省函数调用首先很重要。:-)@Jon如果没有宏,就无法获得调用的\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
,除非您将其写入每个调用,而且每次写入日志(\uuuuuuuuuuuuuuuu文件,\uuuuuuuuuuuuuuuuuuuuuuuuuuu。。我已经为这样的遭遇准备了合适的咒语:管道冲水!缓存小姐!不保证函数内联!卡达布拉!!