programing

time_t와 같이 구현 정의된 유형의 형식 지정자

goodsources 2023. 9. 23. 22:32
반응형

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 가치.tLONG_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 tmgmtime아니면localtime합니다를 사용하여 변환할 수 있습니다.strftime, 아니면ctime에서 직접 time_t현지 시간을 보여주는 문자열에 연결합니다.

C은 C time_treal이며, 이는 정수 또는 부동소수점임을 의미합니다(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

반응형