time_t와 같이 구현 정의된 유형의 형식 지정자
저는 제 코드를 좀 더 플랫폼/구현에 독립적으로 만들고 싶습니다. 모르겠어요time_t
코드가 컴파일될 때 플랫폼에서와 같이 구현됩니다.다음의 유형을 어떻게 알 수 있습니까?t
어떤 형식의 지정자를 사용할지 결정할 수 있습니까?
...
time_t t = time(NULL);
printf("%s", t);
...
일반적으로 캐스트를 사용하여 피연산자를 올바른 형식으로 변환할 수 있습니다.
제안한 솔루션:
time_t t = time(NULL);
printf("%s", t);
분명히 작동하지 않을 것입니다.time_t
입니다가입니다. 그렇지 않습니다.char*
.
우리는 일반적으로 알고 있습니다.time_t
는 산술 형식입니다.이와 같은 것:
printf("%ld\n", (long)t);
대부분의 시스템에서 작동할 가능성이 높습니다.만약에 실패할 수 있습니다.time_t
입니다보다 않은 입니다.unsigned long
가치.t
LONG_MAX
, (b) time_t
부동 소수점 유형입니다.
C99 합니다를 할 수 long long
가더 .
printf("%lld\n", (long long)t);
강조하고 어떤 의 , 를 할 수 .time_t
다음과 같습니다.
if ((time_t)-1 > 0) {
// time_t is an unsigned type
printf("%ju\n", (uintmax_t)t);
}
else if ((time_t)1 / 2 > 0) {
// time_t is a signed integer type
printf("%jd\n", (intmax_t)t);
}
else {
// time_t is a floating-point type (I've never seen this)
printf("%Lg\n", (long double)t);
}
당신은 당신이 조정하는 것이 좋을 수도 있습니다.%Lg
다 같은 을 합니다.%Lf
아니면%.10Lf
.
다시 한 것입니다 여러분은 합니다, 이 합니다.#include <stdint.h>
만들기 위해서uintmax_t
그리고.intmax_t
눈에 보이는
time_t
그리고.clock_t
표준에 시간을 나타낼 수 있는 산술 유형이라고만 명시되어 있다는 점에서 약간 특이합니다.(원칙적으로는 복잡한 유형일 수 있지만, 저는 가능성을 무시하는 것이 위험을 감수할 가치가 있다고 생각합니다.)
대부분의 다른 경우에는 지정된 유형이 서명되었는지, 서명되지 않았는지, 부동 소수점인지를 알 수 있으며, 가장 넓은 유형의 유형으로 변환할 수 있습니다.
을 하세요.time_t
를 나타내므로수 것입니다. 당신은 아마도 당신의 출력을 이해하지 못할 것입니다.printf
: 등)1379375215
그것을 알아내는 것이 목표가 아니라면 둘 중 하나입니다.
C (C C++ 로했다면,std::cout << t << "\n";
입니다를 합니다.operator<<
.)
사람이 읽을 수 있는 출력을 원하는 경우(예:Mon 2013-09-16 16:46:55 PDT
중 에서입니다.<time.h>
를 들면,asctime()
아니면strftime()
.
으로 하는 방법time_t
요소를다입니다.struct tm
gmtime
아니면localtime
합니다를 사용하여 변환할 수 있습니다.strftime
, 아니면ctime
에서 직접 time_t
현지 시간을 보여주는 문자열에 연결합니다.
C은 C time_t
는 real이며, 이는 정수 또는 부동소수점임을 의미합니다(C 2011 (N1570) 6.2.517).따라서 다음으로 변환할 수 있어야 합니다.double
프린트를 해주세요.는 가능성이 있습니다.time_t
다음과 같은 가치를 나타낼 수 있습니다.double
할 수 없기 때문에 이색적인 구현에 주의하려면 이를 방지해야 할 수도 있습니다.부터difftime
합니다의 합니다.time_t
건로서의 double
는 C 는 를 것 .time_t
보다 더 double
.
합니다.difftime()
double
:
time_t t = time(NULL);
printf("seconds 1970->now: %.f\n", difftime(t, (time_t) 0));
그것은 간단하고 나는 휴대가 가능하다고 생각합니다.
에는 C라고 .time_t
는 'real type'이 될 것입니다(정수형 또는 부동 소수점형을 의미하지만 실제로는 항상 정수형입니다).
와 함께time_t
, 당신의 최선의 선택은 그것을 포맷하는 것입니다.strftime()
localtime()
아니면gmtime()
— 이것은 휴대용으로 할 수 있습니다.
어쩔 수 없이 어떤 메커니즘을 통해 올바른 형식 지정자가 무엇인지 결정해야 합니다.사용해도 좋습니다.PRI_[Xxodi]_time
그리고.SCN_[Xxodi]_time
또는 비표준이지만 표준에 가까운 이름(PRI 또는 SCN으로 시작하고 소문자 또는 X가 이어지는 이름)과 유사합니다.당신은 어떤 메커니즘을 사용하여 휴대 불가능한 정보를 한 곳에 캡슐화하는 것을 지정합니다.
언급URL : https://stackoverflow.com/questions/18839043/format-specifiers-for-implementation-defined-types-like-time-t
'programing' 카테고리의 다른 글
부모에서 자식 노드를 모두 제거하시겠습니까? (0) | 2023.09.23 |
---|---|
카르마 / 자스민으로 모달 인스턴스 컨트롤러를 테스트하는 장치 (0) | 2023.09.23 |
.c 파일에서 #ifdef를 피해야 하는 이유는 무엇입니까? (0) | 2023.09.23 |
Docker MYSQL '[2002] 연결 거부' (0) | 2023.09.23 |
JS/jQuery가 HTTP 요청 요청 헤더를 얻습니까? (0) | 2023.09.23 |