Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 是否有充分的理由不使用';定义';参数长度可变?_C_C Preprocessor_Variadic Functions - Fatal编程技术网

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。。我已经为这样的遭遇准备了合适的咒语:管道冲水!缓存小姐!不保证函数内联!卡达布拉!!