C ++带有时间戳的断言

丹尼

断言带有时间戳的失败时是否有可能记录信息

前任。

int a = 10

assert( a > 100 );

那么它将失败并输出与时间戳相同的结果

2013-12-02 , 17:00:05 assert failed !! (a > 100) line : 22

谢谢

巴西尔·斯塔林凯维奇

assert是一个宏(它必须是一个,以得到__LINE____FILE__信息)。

您可以定义自己的。tassert由于可读性原因,我可能会用其他名称来命名,例如(未经测试的代码)

#ifdef NDEBUG
#define tassert(Cond) do {if (0 && (Cond)) {}; } while(0)
#else
#define tassert_at(Cond,Fil,Lin) do { if ((Cond)) {  \
   time_t now##Lin = time(NULL);                     \
   char tbuf##Lin [64]; struct tm tm##Lin;           \
   localtime_r(&now##Lin, &tm##Lin);                 \
   strftime (tbuf##Lin, sizeof(tbuf##Lin),           \
             "%Y-%m-%d,%T", &tm##Lin);               \
   fprintf(stderr, "tassert %s failure: %s %s:%d\n", \
           #Cond, tbuf##Lin, Fil, Lin);              \
   abort();   }} while(0)
#define tassert(Cond) tassert_at(Cond,__FILE__,__LINE__) 
#endif /*NDEBUG*/

我使用的CPP串联 ##Lin降低名称冲突的概率,而我使用的CPP字串 #做出串出的Cond宏观形式。Cond始终扩大,一定要确保编译器捕获的语法错误禁用,即使tassertNDEBUG作为断言(3)一样。

可以通过某种功能将大部分代码放在上述宏中,例如

 void tassert_at_failure (const char* cond, const char* fil, int lin) {
   timer_t now = time(NULL);
   char tbuf[64]; struct tm tm;
   localtime_r (&now, &tm);
   strftime (tbuf, sizeof(tbuf), "%Y-%m-%d,%T", &tm);
   fprintf (stderr, "tassert %s failure: %s %s:%d\n",
            cond, tbuf, fil, lin);
   abort();
 }

然后定义(有点像<assert.h>...)

 #define tassert_at(Cond,Fil,Lin) do { if ((Cond)) {  \
    tassert_at_failure(#Cond, Fil, Lin); }} while(0)

但我不喜欢多,做法,因为与调试gdb已经  abort()被称为在宏的代码调试可执行文件更容易(恕我直言大小并不在所有问题;呼吁abort在宏是方便多内gdb-使短回溯并避免使用一条down命令...)。如果您不想要libc可移植性,而只是使用最新的GNU libc,则可以简单地重新定义Glibc特定的__assert_fail功能(请参阅<assert.h>头文件中的内容)。YMMV。

顺便说一句,在实际的C ++代码中,我更喜欢将其<<用于类似断言的调试输出。这样可以使用我自己的operator <<输出例程(如果您将其作为附加的宏参数提供),因此我正在考虑(未经测试的代码!)

#define tassert_message_at(Cond,Out,Fil,Lin)         \
 do { if ((Cond)) {                                  \
   time_t now##Lin = time(NULL);                     \
   char tbuf##Lin [64]; struct tm tm##Lin;           \
   localtime_r(&now##Lin, &tm##Lin);                 \
   strftime (tbuf##Lin, sizeof(tbuf##Lin),           \
             "%Y-%m-%d,%T", &tm##Lin);               \
   std::clog << "assert " << #Cond << " failed "     \
             tbuf##Lin << " " << Fil << ":" << Lin   \
             << Out << std::endl;                    \
   abort (); } } while(0)
#define tassert_message(Cond,Out) \
    tassert_message_at(Cond,Out,__FILE__,__LINE__)

然后我会用 tassert_message(i>5,"i=" << i);

顺便说一句,您可能要使用syslog(3)而不是fprintftassert_at宏中使用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C ++带有时间戳的断言

来自分类Dev

带有时间戳的更高时间戳精度

来自分类Dev

将带有时间(H / m / s)的儒略日期转换为C#中的日期时间

来自分类Dev

在C#中有时间延迟

来自分类Dev

C#使用Windows Service形成带有时间,天数检查的每日邮件发送

来自分类Dev

如何读取带有时间戳字段的csv?

来自分类Dev

带有时间戳的Cassandra COPY TO

来自分类Dev

带有时间戳的Gradle distZip存档

来自分类Dev

批量脚本移动带有时间戳的文件

来自分类Dev

在Cassandra中使用带有时间戳的插入

来自分类Dev

带有时间戳的postgreSQL排序

来自分类Dev

带有时间戳的Cassandra COPY TO

来自分类Dev

带有时间戳的MySQL转储

来自分类Dev

带有时间戳的逻辑删除

来自分类Dev

查找并打印带有时间戳的文件

来自分类Dev

带有时间戳的MomentJS返回日期

来自分类Dev

保存带有时间戳的实时视频帧

来自分类Dev

Laravel的带有时间戳的ORM同步不会更新时间戳

来自分类Dev

ORACLE将DATE转换为带有时间戳的时区的时间戳

来自分类Dev

带有时间戳的pdf签名:时间戳授权不可用

来自分类Dev

Laravel的带有时间戳的ORM同步不会更新时间戳

来自分类Dev

检索没有时间戳

来自分类Dev

带有时间戳的mysql数据库中时间序列的最佳索引策略

来自分类Dev

将带有时间戳的Excel文件转换为python日期和时间

来自分类Dev

如何添加带有时间戳的时间检查约束?

来自分类Dev

GitHub API通过带有时间戳的用户ID查找所有提交

来自分类Dev

C#-在LINQ上比较没有时间的DateTime吗?

来自分类Dev

使用熊猫读取带有时间戳列的csv

来自分类Dev

我可以从带有时间戳的图像创建VFR视频吗?

Related 相关文章

热门标签

归档