是否有可能在编译时得到时间(当天)和日期?

时间:2013-06-25 08:46:27

标签: c++ c windows unix compilation

有什么可能在编译时知道时间和日期(BUILDTIME),以便以可移植的方式在二进制文件(可执行文件/库)中包含有关它们创建时刻的信息?

我们目前有一个使用sh.exe的解决方案,需要在Windows下安装msys,但我想知道是否可以在没有它的情况下安装。

搜索“构建时间/日期”,“编译时间/日期”等内容并未导致任何相关结果。

修改

当我了解__TIME__时,之后可能会发现此问题:Recording the time when you compile a source

4 个答案:

答案 0 :(得分:12)

标准宏__DATE____TIME__完成工作。

请注意,这将为您提供使用它们的文件的编译日期。不是链接日期。因此,每次构建文件时都必须touch,或者在MSVC中执行预构建步骤。

The C99 standard says

  

6.10.8预定义的宏名称

     

以下宏名称应由实现定义:

     
      
  • __DATE__:预处理翻译单元的翻译日期:“Mmm dd”形式的字符串文字   yyyy“,其中月份的名称与生成的月份相同   通过asctime函数,dd的第一个字符是空格   如果值小于10,则为字符。如果翻译日期为   不可用,应提供实施定义的有效日期。
  •   
  • __TIME__:预处理翻译单元的翻译时间:形式为“hh:mm:ss”的字符串文字为   在asctime函数生成的时间内。如果时间   翻译不可用,是实现定义的有效时间   应提供。
  •   

我在这里复制了C99文本,但是这些宏比C99要老......我没有找到旧版C的标准文本...

答案 1 :(得分:1)

您可以使用__DATE____TIME__等宏。这对于Visual Studio也是可移植的(参见http://msdn.microsoft.com/en-us/library/b0084kay(v=vs.80).aspx

答案 2 :(得分:1)

您可以随时编写一个调用timestrftime的5行程序,并将其输出到文件,而不是使用sh。 [我已经使用这种方法来更新过去的“版本号”和/或“版本号”]。

答案 3 :(得分:1)

除了__DATE____TIME__宏之外,您还可以在构建时使用宏将值传递给您的程序。

在Makefile中,您可以在构建时传递宏:

gcc -Wall -DBUILD_TIME=`date +%d%m%y_%T` tst.c -o tst

(或使用任何其他date格式)

然后在你的代码中字符串化:

#define STR(x) STR1(x)
#define STR1(x) #x

printf("%s\n", STR(BUILD_TIME));  // display build time