在使用和不使用DEBUG标志编译时,我需要打印msg1和msg2以获得相同的错误。 E.g。
fprintf( stderr,
#ifdef DEBUG
"error msg1 %s",__FILE__
#else
"error msg2"
#endif
);
或其他方式可能是将这些msg1
和msg2
传递给函数并使用vfprintf()
进行打印。
可能,第二种方法会产生运行时开销。所以,我只是想知道这可能是更好的方法吗?
E.g。用例可能是代码需要使用info
和debug
标志进行编译。 info
可能是与用户相关的消息,debug
可能是出于调试目的。
有什么建议?
答案 0 :(得分:2)
通常在代码中使用跟踪来帮助调试它,因此例如在您的NULL指针测试中,您可以添加类似if (ptr==NULL) DEBUG("Entering Null pointer");
的smth。我只是告诉你,因为我不喜欢和你为什么要同时使用msg1
和msg2
。
对我来说,我通常使用宏DEBUG
和全局变量verbose
:
#define DEBUG(...)\
if(verbose && SHOW_ERROR) {\
printf("Error : %s, %d",__FUNCTION__, __LINE__);\
printf(__VA_ARGS__);\
}\
else if (verbose && SHOW_WARNING) {\
printf("Warning : %s, %d",__FUNCTION__, __LINE__);\
printf(__VA_ARGS__);\
}
示例:
#include <stdio.h>
#define SHOW_ERROR 1
#define SHOW_WARNING 2
int verbose = 1;
int main()
{
DEBUG("THIS WILL SHOW ERROR MSG");
verbose = 2;
DEBUG("THIS WILL SHOW WARNING MSG");
}
希望我能帮忙。
答案 1 :(得分:1)
对vfprintf
的无条件调用确实带来了一些额外的开销,用于打包额外参数a
,以便与变量参数列表函数一起使用。此外,条件编译允许编译器注意到fprintf
模式下DEBUG
的调用不传递格式字符串以外的参数,并将其替换为fputs("error msg1", stderr)
*
然而,这种开销很小,你不太可能注意到它的任何一个,因为写作无条件地发生,并且它将主导呼叫的时间。
* DEBUG
输出提供较少的详细信息比非调试的少得多;通常,情况正好相反。
答案 2 :(得分:1)
您的调试标志是预处理器宏,因此将在编译时选择错误消息,这是您想要的行为吗?
我建议采用略有不同的方法:
dbg
可以在运行时打开和关闭#define PRINT_INFO_VAR(msg1,msg2...) if(dbg){fprintf(stderr,msg1);}\
else{fprintf(stderr,msg2);}
标志
您可以使用variadic macros:
进行更多游戏PRINT_INFO_VAR(msg1,msg2,a)
对于你给出的例子,它看起来像这样:
class TMyClass
{
private:
int FMyFoo1;
int GetMyFoo2();
void SetMyFoo2(int AMyFoo2);
public:
__property int MyFoo1 = {read=FMyFoo1, write=FMyFoo1};
__property int MyFoo2 = {read=GetMyFoo2, write=SetMyFoo2};
};