C ++ __TIME__ отличается при вызове из разных файлов - PullRequest
0 голосов
/ 10 февраля 2019

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

Можно ли как-нибудь это исправить?Или почему это происходит?
Все, что я делаю, это printf("%s\n", __Time__); из разных функций в разных источниках.

Ответы [ 3 ]

0 голосов
/ 11 февраля 2019

Ну, я думаю, что ваш вариант использования довольно странный, но простой способ получить одинаковое время во всех файлах - это использовать __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);
0 голосов
/ 11 февраля 2019

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

Однако вы задаете вопрос XY .Чтобы обратиться к тому, что вы на самом деле пытаетесь сделать:

Если вам нужно значение времени компиляции, вам лучше позволить вашей build системе указать его.То есть, используя make или что вы используете, как-нибудь сгенерируйте случайное начальное число, а затем передайте его компилятору в качестве параметра командной строки, чтобы определить свой макрос препроцессора own (например, gcc -DMY_SEED=$(random_value) ...),Затем вы можете применить это к всем C файлам, которые вы компилируете, и каждый из них будет использовать MY_SEED так, как вы хотите.

0 голосов
/ 10 февраля 2019

Или почему это происходит?

Из документов:

Этот макрос расширяется до строковой константы, которая описывает время, в котороепрепроцессор запускается .

Если исходные файлы компилируются в разное время, тогда время будет другим.

Есть ли в любом случае, я могу это исправить?

Вы можете использовать инструмент командной строки, чтобы сгенерировать строку времени, и передать строку как определение макроса компилятору.Таким образом, время будет одинаковым для всех файлов, скомпилированных этой командой.

...