C++ __TIME__ отличается при вызове из разных файлов
3 ответа
Или почему это происходит?
Из документов:
Этот макрос расширяется до строковой константы, которая описывает время, в которое запускается препроцессор.
Если исходные файлы компилируются в разное время, то время будет другим.
Можно ли как-нибудь это исправить?
Вы можете использовать инструмент командной строки, чтобы сгенерировать строку времени, и передать строку как определение макроса компилятору. Таким образом, время будет одинаковым для всех файлов, скомпилированных этой командой.
Чтобы ответить на ваш оригинальный вопрос: __TIME__
будет отличаться для разных файлов, потому что он указывает время, когда этот конкретный файл был скомпилирован.
Тем не менее, вы задаете проблему XY. Чтобы решить, что вы на самом деле пытаетесь сделать:
Если вам нужно значение времени компиляции, вам лучше позволить системе сборки указать его. То есть с make
или что бы вы ни использовали, сгенерируйте случайное начальное число как-нибудь, а затем передайте его компилятору в качестве параметра командной строки, чтобы определить свой собственный макрос препроцессора (например, gcc -DMY_SEED=$(random_value) ...
). Затем вы можете применить это ко всем файлам C, которые вы компилируете, и использовать каждый из них. MY_SEED
как пожелаешь.
Ну, я думаю, что ваш вариант использования довольно странный, но простой способ получить одинаковое время во всех файлах - это использовать __TIME__
ровно в одном исходном файле и используйте его для инициализации глобальной переменной:
compilation_time.h:
const char *compilation_time;
compilation_time.c:
#include "compilation_time.h"
const char *compilation_time = __TIME__;
more_code.c:
#include "compilation_time.h"
...
printf("%s\n", compilation_time);
Если вы действительно хотите построить целое число, как в вашем комментарии (который может быть непереносимым, поскольку предполагает ASCII), вы можете сделать
seed.h:
const int seed;
seed.c:
#include "seed.h"
const int seed = (__TIME__[0] - '0') + ...;
more_code.c:
#include "compilation_time.h"
...
srand(seed);