2013-07-06 2 views

ответ

17

О, оптимист! Вы бы не ожидали, что один стандарт обратит внимание на другого, не так ли? Определение __TIMESTAMP__ не соответствует стандарту C, так как вам известно. Было бы здорово иметь такой формат, как ваш предложенный вами __TIMESTAMP_ISO__ (вы всегда хотели бы время Зулу, или было бы лучше иметь смещение локального часового пояса?), Но, откровенно говоря, самый простой способ добавить его может быть патчем к GCC и Clang и так далее.

Вы можете попробовать обезьяну с asctime(), как предложено user1034749answer, но я бы не попробовал это.

В GCC 4.8.1 manual, есть интересное подавление предупреждения:

-Wno-builtin-macro-redefined
Не предупреждать, если некоторые встроенные макросы переопределены. Это подавляет предупреждения для переопределения __TIMESTAMP__, __TIME__, __DATE__, __FILE__ и __BASE_FILE__.

Это говорит о том, вы можете попробовать:

gcc ... -Wno-builtin-macro-redefined -D__TIMESTAMP__=$(date +'"%Y-%m-%dT%H:%M:%S"') ... 

Однако некоторые более ранние версии GCC не поддерживают опцию; (Обратите внимание на иероглифы, необходимые для получения строки из date окруженной двойных кавычек.) Я не помню, чтобы это было раньше. Вы все еще можете переопределить __TIMESTAMP__:

$ gcc -std=c99 -Wall -Wextra -O xx.c -o xx 
$ ./xx 
Fri Jul 5 19:56:25 2013 
$ gcc -std=c99 -Wall -Wextra -D__TIMESTAMP__=$(date +'"%Y-%m-%dT%H:%M:%S"') -O xx.c -o xx 
<command-line>: warning: "__TIMESTAMP__" redefined 
$ ./xx 
2013-07-05T20:10:28 
$ 

Не очень красиво, но это работает ... Да, и только для записи, исходный код был (тривиальное):

#include <stdio.h> 

int main(void) 
{ 
    printf("%s\n", __TIMESTAMP__); 
    return 0; 
} 
+1

Большое спасибо! Я использую это в своем make-файле: 'CFLAGS + = -D__TIMESTAMP_ISO __ = $ (shell date -u + '" \ "% Y-% m-% dT% H:% M:% SZ \" "')' работает как очарование с clang, gcc, icc и т. д. :) –

+3

Рад, что он работает - он должен. Теоретически вы не должны использовать имя, начинающееся с double-underscore; они зарезервированы для «реализации». Как я уже отмечал, маловероятно, что у вас действительно возникнут проблемы, но вы также можете использовать '-DTIMESTAMP_ISO = ...'и быть полностью свободным от риска (столкновения с будущими воплощениями« реализации »). –

+2

:) Я обновлю свое использование, как вы порекомендовали! Кроме того, если я использую '-r $ (SRC)' где 'SRC' является переменной make для компилируемого файла, как в' CFLAGS + = -DTIMESTAMP_ISO = $ (shell date -r $ (SRC) -u + '" \ "% Y-% m-% dT% H:% M:% SZ \" "')', я точно сопоставляю исходное поведение '__TIMESTAMP__'; а именно дата не изменяется в каждой сборке, если исходный файл не был изменен до сборки. –

-1

лязг и GCC используется функция C "asctime" для этой цели, я полагаю, МЦХ также использует его. В Linux вы можете использовать LD_PRELOAD для вызова вызова asctime и замены любой нужной строкой.

0

Если вам нужен на самом деле кросс-платформенный способ скомпилировать строку штампа времени, отформатированную в ISO 8601, или любой другой формат, определенный во время компиляции, вы можете вместо этого использовать CMake (что всегда полезно рассмотреть).

Что вы хотите can be easily accomplished with CMake.

Смежные вопросы