C++ __TIME__ отличается при вызове из разных файлов

Я столкнулся с этой странной вещью, играя с предопределенными макросами. Так что в основном при звонке __TIME__ из разных файлов это происходит:

Можно ли как-нибудь это исправить? Или почему это происходит?
Все что я делаю printf("%s\n", __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);
Другие вопросы по тегам