在编译时验证in-code-message-age

时间:2015-09-06 15:46:52

标签: c++ visual-studio-2012

我们允许程序员向代码添加TODO消息。每次编译文件时,都会将消息写入输出(通过编译指示消息)。 TODO是一个宏,包含创建时的消息和日期。例如。 TODO(3, 8, 2015, "...");

我想验证没有TODO超过30天(大致),并且如果存在,则阻止编译。 (您当然可以更改日期,但在版本控制中会清晰可见)

我需要解决方案,它适用于MS VC 2012

我已经写过(基于other question)一个版本,在gcc上工作正常 - Here is working example 但它没有在error C2057 : expected constant expression消息

的visual studio上编译
#define TOTAL_DAYS(day,month,year) (day + month*31 + year*365)

namespace checkingDate
{
#define C(i) static const char c##i = __DATE__[i];

    C(0); C(1); C(2); C(3);
    C(4); C(5); C(6); C(7);
    C(8); C(9); C(10);

    static const int current_date = c4 == ' ' ? c5 - '0' : c5 - '0' + 10;

    static const int current_month = (
        c0 == 'J' // Jan Jun Jul
        ? (c1 == 'a' ? 1 : (c2 == 'n' ? 6 : 7))
        : c0 == 'F' ? 2
        : c0 == 'M' // Mar May
        ? (c2 == 'r' ? 3 : 5)
        : c0 == 'A' // Apr Aug
        ? (c1 == 'p' ? 4 : 8)
        : c0 == 'S' ? 9
        : c0 == 'O' ? 10
        : c0 == 'N' ? 11
        : 12
        );

    static const int current_year = ((c7 - '0') * 1000) + ((c8 - '0') * 100) + ((c9 - '0') * 10) + (c10 - '0');
    static const int totalDays = TOTAL_DAYS(current_date, current_month, current_year);
}

#   define TODO(day,month,year, str)  static_assert(checkingDate::totalDays - TOTAL_DAYS(day,month,year)<30, "old msg");

int main()
{
    TODO(3, 8, 2015, "...");
}

我可以以某种方式修复此错误吗? 是我的错误还是MS VC错误? 还有其他方式来编写它,所以它适用于visual studio吗?

0 个答案:

没有答案