2013-07-06 44 views

Trả lời

17

Tôi rất lạc quan! Bạn sẽ không thực sự mong đợi một tiêu chuẩn để chú ý đến một tiêu chuẩn khác, phải không? Định nghĩa __TIMESTAMP__ không nằm trong tiêu chuẩn C, như bạn đã biết. Nó sẽ là tuyệt vời để có một định dạng như đề xuất của bạn __TIMESTAMP_ISO__ (bạn sẽ luôn luôn muốn thời gian Zulu, hoặc nó sẽ là tốt hơn để có bù đắp múi giờ địa phương?), Nhưng thẳng thắn, cách dễ nhất để có được nó có thể là một bản vá để GCC và Clang và vân vân.

Bạn có thể thử khỉ với asctime() như được đề xuất bởi user1034749 's answer, nhưng tôi không muốn thử điều đó.

Trong GCC 4.8.1 manual, có một ức chế cảnh báo thú vị:

-Wno-builtin-macro-redefined
Không cảnh báo nếu một số macro built-in được định nghĩa lại. Điều này ngăn chặn các cảnh báo để xác định lại số __TIMESTAMP__, __TIME__, __DATE__, __FILE____BASE_FILE__.

Điều này cho thấy bạn có thể thử:

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

Tuy nhiên, một số phiên bản trước của GCC không hỗ trợ tùy chọn; (Lưu ý các chữ tượng hình cần thiết để có được những chuỗi từ date bao quanh bởi dấu ngoặc kép). Tôi không nhớ đã nhìn thấy nó trước đây. Bạn vẫn có thể xác định lại __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 
$ 

Không rất đẹp, nhưng nó hoạt động ... Oh, và chỉ dành riêng cho các hồ sơ, mã nguồn là (tầm thường):

#include <stdio.h> 

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

Cảm ơn rất nhiều! Tôi đang sử dụng điều này trong makefile của tôi: 'CFLAGS + = -D__TIMESTAMP_ISO __ = $ (shell date -u + '" \ "% Y-% m-% dT% H:% M:% SZ \" "')' hoạt động như một quyến rũ với clang, gcc, icc, vv :) ​​ –

+3

Vui vì nó hoạt động - nó phải. Về mặt lý thuyết, bạn không nên sử dụng tên bắt đầu bằng dấu gạch dưới kép; chúng được dành riêng cho 'triển khai'. Như tôi đã lưu ý, có khả năng bạn sẽ không gặp vấn đề gì, nhưng bạn cũng có thể sử dụng '-DTIMESTAMP_ISO = ...'và hoàn toàn rõ ràng về rủi ro (va chạm với các hiện thân tương lai của 'việc thực hiện'). –

+2

:) Tôi sẽ cập nhật việc sử dụng của tôi như bạn đề nghị! Ngoài ra, nếu tôi sử dụng '-r $ (SRC)' trong đó 'SRC' là biến làm cho tệp hiện đang được biên dịch như trong' CFLAGS + = -DTIMESTAMP_ISO = $ (ngày kết thúc -r $ (SRC) -u + '" \ "% Y-% m-% dT% H:% M:% SZ \" "')', tôi phù hợp với hành vi '__TIMESTAMP__' gốc chính xác; cụ thể là ngày không thay đổi trên mỗi bản dựng trừ khi tệp nguồn đã được sửa đổi trước khi xây dựng. –

-1

kêu vang và gcc sử dụng chức năng C "asctime" cho mục đích này, tôi giả sử icc cũng sử dụng nó. Trên Linux, bạn có thể sử dụng LD_PRELOAD để bắt cuộc gọi asctime và thay thế bằng bất kỳ chuỗi nào bạn muốn.

0

Nếu bạn cần một thực sự đa nền tảng để có chuỗi thời gian biên dịch được định dạng theo tiêu chuẩn ISO 8601 hoặc bất kỳ định dạng nào khác được xác định tại thời gian biên dịch, thay vào đó bạn có thể cân nhắc sử dụng CMake (luôn luôn tốt để xem xét sử dụng).

Điều bạn muốn can be easily accomplished with CMake.

Các vấn đề liên quan