2016-04-27 72 views
7

出于好奇,我想知道标准__TIME__预处理器宏给出的值是否可以在单个翻译单元内更改?是否__TIME__预处理器宏保证在文件内保持不变?

换句话说,__TIME__在预处理过程中被确定一次,然后被修复,或者每次遇到时都会重新评估它吗?

如果这不是C标准规定的,主要实现(gnu,clang,intel,msvc)之间是否存在事实上的标准行为?

+1

请参阅6.10.8.1p1它很可能意味着预处理_starts_。其他任何东西都是无用的。 – Olaf

+1

我认为GNU CPP的当前版本同时为'_TIME__'和'__DATE__'建立了值,当时任何一个宏都是第一次扩展。我不是100%确定的,但是这些宏的一组特定值的范围似乎是在命令行选项被解析时分配的,所以基本上每次调用一次。海湾合作委员会的来源是臭名昭着的复杂。 – NovaDenizen

+0

@NovaDenizen需要'__DATE__'和'__TIME__'的同时性是一个很棒的点!想象一下,如果这两个不是在同一时刻。否则'__TIME__'为'00:00:00','__DATE__'可能是昨天或今天。唯一合理的功能是两个值的一次性设置。 – chux

回答

5

在整个预处理/编译过程中,C没有严格指定“翻译时间”是恒定的。

我的经验一直是恒定的。但是由于它只是第二个,所以给定的汇编需要跨越第二个边界才能有所不同。

__TIME__预处理翻译单元翻译的时间:字符串文字形式"hh:mm:ss"作为在由 asctime功能生成的时间。如果翻译时间不可用,应提供实现定义的有效时间。 C11§6.10.8.11

__DATE____TIME__的定义分别是,日期和 翻译时间不可用(6.10.8.1)。 (资料性附录)C11§J.3.111

+0

我怀疑有一个事实上的标准,但那只是一个意见。然而,我同意[@Olaf](http://stackoverflow.com/questions/36901990/is-time-preprocessor-macro-guaranteed-to-be-constant-within-a-file/36902152#comment61368099_36901990)发生是合理的。现在的问题是它有什么不同的用例呢? – chux

+0

没有我能想到的用例...只是一个好奇心。 – marack