16

__TIMESTAMP__ISO 8601:2004の代替品を入手するにはどうすればよいですか?

__TIMESTAMP__

Sat Jul  6 02:50:06 2013

__TIMESTAMP_ISO__

2013-07-06T00:50:06Z
4

5 に答える 5

21

おお、楽観主義者よ!ある標準が別の標準に注意を払うことを本当に期待していませんか? ご存じの__TIMESTAMP__とおり、定義は標準 C にはありません。あなたが提案したような形式があれば素晴らしいこと__TIMESTAMP_ISO__ですが (常にズールー時間が必要ですか、それともローカル タイム ゾーン オフセットを使用した方がよいでしょうか?)、率直に言って、それを追加する最も簡単な方法は GCC へのパッチかもしれません。そしてClangなど。

user1034749回答asctime()で提案されているように、モンキーを試すことができますが、私はそれを試したくありません。

GCC 4.8.1マニュアルには、興味深い警告の抑制があります。

-Wno-builtin-macro-redefined
特定の組み込みマクロが再定義されても警告しません。__TIMESTAMP__これにより、__TIME__、 、__DATE____FILE__、および の再定義に対する警告が抑制されます__BASE_FILE__

これはあなたが試すことができることを示唆しています:

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

(二重引用符で囲まれた文字列を取得するために必要な象形文字に注意してくださいdate。) ただし、GCC の一部の以前のバージョンでは、このオプションがサポートされていません。前に見た記憶がありません。あなたはまだ再定義することができます__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;
}
于 2013-07-06T03:12:59.720 に答える
0

ISO 8601 またはコンパイル時に定義されたその他の形式でフォーマットされたコンパイル タイム スタンプ文字列を持つ本当にクロスプラットフォームの方法が必要な場合は、代わりにCMakeの使用を検討できます(これは常に使用を検討するのに適しています)。

あなたが望むことは、 CMake で簡単に実現できます

于 2015-07-14T09:02:30.417 に答える