【问题标题】:How to redefine (override) C++ __DATE__ and __TIME__ predefined macros in Visual Studio?如何在 Visual Studio 中重新定义(覆盖)C++ __DATE__ 和 __TIME__ 预定义宏?
【发布时间】:2021-02-15 13:17:43
【问题描述】:

是否有可能在 Microsoft Visual Studio 中重新定义 __DATE____TIME__ 预定义的 C++ 宏(赋予它们而不是默认值)?

我尝试了编译器选项/D "__DATE__=\"Feb 10 2021\"",但我得到了:

pch.cpp : warning C4117: macro name '__DATE__' is reserved, '#define' ignored

而且没有效果。除了修改代码(或确认“不可能”)之外的任何想法?

原因:我拥有的 C++ 项目的构建版本由日期宏值(每个构建版本都从 __DATE__/__TIME__ 值中获取)。我需要模拟一个“较旧”的构建 - 基本上是为了欺骗这个版本控制系统。我不需要更改宏值格式。我还知道@Jabberwocky 提到的另一个用户定义宏的选项。

【问题讨论】:

  • 您可以使用#undef __DATE__#undef __TIME__ 取消定义宏,以便给它一个不同的值。
  • 所有带有两个前导下划线的符号都保留用于实现。创建这样的符号就是UB。来源:timsong-cpp.github.io/cppwp/lex.name#3
  • 这是XY problem 的经典例子。为什么你需要这样做?你的实际目标是什么?
  • @Locke 不,出于同样的原因,这也不起作用
  • 如果这个问题是单事件问题,那么只需更改构建期间的系统时间。最好的解决方案是应用Jabberwockys answear。

标签: c++ visual-studio datetime compilation macros


【解决方案1】:

不,你不能。但你也不需要。不要使用 __DATE__ 但例如BUILD_DATE 并添加:

#ifndef BUILD_DATE
#define BUILD_DATE __DATE__
#endif

并编译:

/D "BUILD_DATE=\"Feb 10 2021\"" 

然后你得到你想要的确切行为。

但如果你真的不能按照建议用你自己的东西替换__DATE__,那你就倒霉了。

【讨论】:

  • 可能他们想要一种有用的日期格式,例如整数形式,而不是 C 中无用的 __DATE__ 将月份写成文本。
  • @Lundin 不确定,因为他们写了/D "__DATE__=\"Feb 10 2021\"",这是__DATE__ 的确切无用格式。
【解决方案2】:

一种方法是伪造 MSVC cl.exe 感知的时间。这可以通过在具有不同时间的虚拟机(如Windows Sandbox)内运行编译器来完成,或者使用一些 3rd 方解决方案(如RunAsDate)来更改进程的时间:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-26
    • 2014-12-31
    • 1970-01-01
    • 2015-10-15
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多