代码之家  ›  专栏  ›  技术社区  ›  Patrick

是否可能有“超时”的源代码(在某一时刻后变为无效)?

  •  9
  • Patrick  · 技术社区  · 14 年前

    我们目前正忙着从VisualStudio 2005迁移到VisualStudio 2010(使用非托管C/C++)。这意味着大约一半的开发人员已经在使用Visual Studio 2010,而另一半仍在使用Visual Studio 2005。最近,我遇到了这样一种情况:在Visual Studio 2010中,某些构造可以以干净的方式编写,但在Visual Studio 2005中,对源代码的要求较低。因为并非所有开发人员的计算机上都已安装了Visual Studio 2010,所以我必须编写如下代码:

    #if _MSC_VER >= 1600
       // clean version of the source code
    #else
       // less clean version
       // of the source code
       // requiring multiple lines of code
       // and requiring some dirty static_casts
    #endif
    

    由于所有开发人员都将在今年年底前迁移到Visual Studio 2010,因此我希望在某个时刻后,此代码自动“消失”。在源代码中保持“不太干净的版本”会导致长期无法读取源代码。

    当然,我知道代码不会自动消失,所以我实际上需要一个自动警铃在某一时刻之后。像这样:

    #if _MSC_VER >= 1600
       // clean version of the source code
    #else
       // less clean version
       // of the source code
       // requiring multiple lines of code
       // and requiring some dirty static_casts
    #endif
    #if compilation_date is after 1 november 2010
    #   error "Remove Visual Studio 2005 compatibility code from this file"
    #endif
    

    这样,如果我们忘记了这一点,我们会在2010年11月1日之后自动得到通知。

    这个技巧可能需要使用 日期 但由于这需要由预编译器处理,因此不能执行字符串操作或使用C日期/时间函数。

    我也考虑过给自己发送一封延迟的邮件的另一种想法,但是我想知道在源代码中是否没有内置的解决方案。

    4 回复  |  直到 14 年前
        1
  •  6
  •   Steve Jessop    14 年前

    就我个人而言,我会选择不相信每个人都会在预期的日期前移民。即使我确信这会发生,我也不想为任何人创造额外的工作,或者在我错了的情况下阻止他们工作。

    如果没有其他内容,那么构建应该是可复制的。如果,在12月,你意识到你需要从10月开始复制一个构建呢?您不能(至少,在构建机器上不需要预测时钟),因为它将不再编译。

    所以,我会这样做:

    support2005.h
    -------------
    
    // empty file
    
    source file
    -----------
    
    #include "support2005.h"
    #if _MSC_VER >= 1600
       // clean version of the source code
    #else
       // less clean version
       // of the source code
       // requiring multiple lines of code
       // and requiring some dirty static_casts
    #endif
    

    一旦每个人都有了vs 2010,将support2005.h更改为包含 #error "Remove Visual Studio 2005 compatibility code from this file" .

    实际上,我个人不会检查这一变化,因为它将阻止任何人做任何工作,直到2005年的支持被取消。删除死码真的是贵公司在11月1日上午可能承担的最高优先级任务吗?甲板上的所有人都需要这样做吗?相反,我会签出、删除文件、进行完整的构建、一直删除兼容性代码,直到所有内容都重新构建,并将整个过程作为“删除vs 2005支持”进行检查。

    你说你担心会忘记,但如果你忘记了,那又怎样?死代码不会伤害任何人。下一次查看这些文件时,或者下一次在文件列表、头依赖关系图等中看到“support2005.h”时,您将记住它。因此,它不是“使源代码长期不可读”,因为长期来看它的任何人都可以忽略或删除它。如果您有任何类型的问题跟踪软件,您可以找到2010-11-01之后的第一个里程碑,并将任务附加到它上,“删除vs 2005支持,并摆脱support2005.h”,注意到目前仍在使用vs 2005的开发人员阻止了这一点。

    如果你真的想让2010-11-01成为一个艰难的最后期限,在这个期限之后代码会被破坏,那么就在万圣节的午夜前熬夜,然后检查破坏的变化。它实际上并不像您所请求的那样破坏代码,但它确实破坏了从源代码管理刷新的任何人,因此它可能破坏了构建。最重要的是,它是非常容易逆转的,或者可以被局部抑制,如果结果是阻止某人完成工作。

        2
  •  15
  •   qrdl    14 年前

    在GNU的情况下 make 我会这样做:

    cflags+=-dcurdate=$(shell日期+%y%m%d)

    它将添加宏 CURDATE 到包含当前时间的编译器标志,格式为YYYYMMDD。

    所以在源代码中,您可以这样做:

    #if CURDATE > 20101101
    #error "Do whatever you have to do"
    #endif
    

    你能在vs里做点什么吗?

        3
  •  2
  •   Uli Schlachter    14 年前

    我只是用一个预处理器来定义 #ifdef WARN_OLD_COMPAT . 对于延迟的邮件,您将记住定义这一点。

    检查编译日期是否晚于<x>在其他方面是不可能的。

        4
  •  1
  •   Peter Alexander    14 年前

    为什么不在运行时在dev构建中进行检查呢?当然,您测试了您的代码,所以当有人在日期之后第一次测试它时,您将收到通知。