time_t는 최종적으로 typedef는 무엇입니까?
Linux 박스를 검색해 보니 다음과 같은 typedef가 있습니다.
typedef __time_t time_t;
나는 그 책을 수 .__time_t
★★★★★★ 。
time_t Wikipedia 기사에서는 이에 대해 설명하고 있습니다.결론은 이 타입이time_t
C 사양에서는 보증되지 않습니다.
time_t
은 시스템 값을 하기 위해 C 입니다.datatype은 ISO C의 데이터 유형입니다.됩니다.time()
라이브러리 기능.이 유형은 표준 헤더에 정의된 typedef입니다.ISO C는 time_t를 산술 유형으로 정의하지만 특정 유형, 범위, 해상도 또는 인코딩은 지정하지 않습니다.시간 값에 적용되는 산술 연산의 의미도 지정되지 않았습니다.Unix 및 POSIX 준거 시스템은 타입을 (일반적으로 32비트 또는 64비트 폭)으로 실장합니다.이는 Unix epoch가 시작된 이후 초수를 나타냅니다.UTC는 1970년 1월1일 자정(윤초 제외)입니다.음의 시간 값을 올바르게 처리하는 시스템과 그렇지 않은 시스템이 있습니다.32비트를 사용하는 시스템
time_t
타입은 Year 2038 문제의 영향을 받기 쉽습니다.
[root]# cat time.c
#include <time.h>
int main(int argc, char** argv)
{
time_t test;
return 0;
}
[root]# gcc -E time.c | grep __time_t
typedef long int __time_t;
$INCDIR/bits/types.h
★★★★
# 131 "/usr/include/bits/types.h" 3 4
# 1 "/usr/include/bits/typesizes.h" 1 3 4
# 132 "/usr/include/bits/types.h" 2 3 4
표준
William Brendel은 위키피디아를 인용했지만, 나는 믿을 만한 소식통으로부터가 더 좋다.
C99 N1256 표준 초안 7.23.1/3 "Components of time"에는 다음과 같이 기술되어 있습니다.
선언된 유형은 size_t(7.17에서 설명) clock_t 및 time_t로, 시간을 나타낼 수 있는 산술형입니다.
6.2.5/18 "유형"에는 다음과 같이 기술되어 있습니다.
정수형 및 부동형은 집합적으로 산술형이라고 불립니다.
POSIX 7 sys_types.h는 다음과 같이 말합니다.
[CX] time_t는 정수형이어야 한다.
서 ''는[CX]
는 다음과 같이 정의됩니다.
[CX] ISO C 표준으로의 확장.
이는 부동 소수점이 제외된다는 보다 강력한 보증을 하기 때문에 확장입니다.
gcc 원라이너
Quassnoi에서 언급한 대로 파일을 만들 필요가 없습니다.
echo | gcc -E -xc -include 'time.h' - | grep time_t
Ubuntu 15.10 GCC 5.2의 상위2 행은 다음과 같습니다.
typedef long int __time_t;
typedef __time_t time_t;
에 " " "에서 따옴표가 몇 개 .man gcc
:
-E
" 후 ; 를 제대로 "전처리 단계 후 중지; 전처리 단계"-xc
: 파일 확장자가 없는 stdin에서 입력되므로 C 언어를 지정합니다.-include file
파일」은, #파일이라고 하는 것입니다.-
: stdin에서 입력
답은 확실히 구현에 따라 다릅니다.사용하고 있는 플랫폼/컴파일러에 대해서 확실히 알아보려면 , 코드에 다음의 출력을 추가해 주세요.
printf ("sizeof time_t is: %d\n", sizeof(time_t));
정답이 4(32비트)이고 데이터가 2038을 초과하는 경우 코드를 마이그레이션하는 데 25년이 걸립니다.
데이터를 문자열로 저장하면 다음과 같은 간단한 데이터라도 문제가 없습니다.
FILE *stream = [stream file pointer that you've opened correctly];
fprintf (stream, "%d\n", (int)time_t);
그런 다음 동일한 방식으로 다시 읽으면(읽기, fscanf 등), 에폭오프셋 시간을 얻을 수 있습니다.에서도 같은 회피책이 있습니다.Net. Win과 Linux 시스템 간에 64비트 에폭 수치를 문제없이 전달합니다(통신 채널을 통해).그러면 바이트 순서 문제가 발생하지만, 그건 다른 주제입니다.
팍스디아블로의 질문에 답하자면, 프로그램이 이렇게 쓰여졌기 때문에 "19100"으로 인쇄되었다고 말할 수 있다(80년대에 내가 직접 이 일을 했다는 것은 인정한다).
time_t now;
struct tm local_date_time;
now = time(NULL);
// convert, then copy internal object to our object
memcpy (&local_date_time, localtime(&now), sizeof(local_date_time));
printf ("Year is: 19%02d\n", local_date_time.tm_year);
printf
is:에 ": 1900(스테이트먼트의 : years is: 19)가 제로 합니다.tm->tm_year
그 이 100 이 이 됩니다 2000년 100년 "%02d"
패드는 0이 2개 있지만 두 자리보다 길면 잘리지 않습니다.
올바른 방법은 다음과 같습니다(마지막 행으로만 변경).
printf ("Year is: %d\n", local_date_time.tm_year + 1900);
새로운 질문:그 생각의 근거는 무엇입니까?
로 Visual Studio 2008이 .__int64
「 」를 한_USE_32BIT_TIME_T
수 있기 . 플랫폼마다 변경될 수 있기 때문에 정의 내용을 모르는 척하는 것이 좋습니다.
time_t
64비트 머신에서는 타입입니다.그렇지 않으면 입니다.
다음 헤더 파일에서 확인할 수 있습니다.
time.h
/usr/include
types.h
★★★★★★★★★★★★★★★★★」typesizes.h
/usr/include/x86_64-linux-gnu/bits
(아래의 문장은, 차례차례가 아닙니다.반응에서 찾을 수 있을 거야Ctrl+f 검색을 사용하여 헤더 파일을 만듭니다.)
인 1) ★★time.h
typedef __time_t time_t;
인 2) »types.h
# define __STD_TYPE typedef
__STD_TYPE __TIME_T_TYPE __time_t;
인 3) »typesizes.h
#define __TIME_T_TYPE __SYSCALL_SLONG_TYPE
#if defined __x86_64__ && defined __ILP32__
# define __SYSCALL_SLONG_TYPE __SQUAD_TYPE
#else
# define __SYSCALL_SLONG_TYPE __SLONGWORD_TYPE
#endif
4) ★★★★★★★★★★★★★★*types.h
#define __SLONGWORD_TYPE long int
#if __WORDSIZE == 32
# define __SQUAD_TYPE __quad_t
#elif __WORDSIZE == 64
# define __SQUAD_TYPE long int
#if __WORDSIZE == 64
typedef long int __quad_t;
#else
__extension__ typedef long long int __quad_t;
대부분의 레거시 플랫폼에서 32비트 부호 정수형입니다.그러나 이로 인해 2038년 버그로 인해 코드가 손상되었습니다.따라서 현대의 C 라이브러리는 대신 서명된 64비트 int로 정의해야 하며, 이는 몇 십억 년 동안 안전합니다.
의 기본 는 typedefs에 .bits
★★★★★★★★★★★★★★★★★」asm
저는 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★./usr/include/x86_64-linux-gnu/bits/types.h
.
특정 헤더를 확인하려면 grep 또는 Quassnoi에서 제안한 것과 같은 프리프로세서 호출을 사용할 수 있습니다.
time_t typedef는 최종적으로 무엇을 의미합니까?
강력한 코드는 어떤 타입이든 상관없습니다.
C종time_t
같은 타입이 되다double, long long, int64_t, int
등 , , 등.
수도 있다unsigned
많은 이 「복귀치」가 에.-1
(time_t)(-1)
이 않습니다 - 이 구현 선택은 흔치 않습니다.
요점은 '알 필요가 있다'는 타입은 드물다는 것입니다.코드를 작성하여 필요성을 피해야 합니다.
알 필요가 있다'는하려고 할 때 합니다.time_t
넓은 에 대응할 수 있습니다. 가장 넓은 정수형으로 주조하는 것은 대부분의 현대 케이스에 적합합니다.
time_t now = 0;
time(&now);
printf("%jd", (intmax_t) now);
// or
printf("%lld", (long long) now);
★★★★★★★★★★★★★★★★★★★★에 캐스팅double
★★★★★★★★★★★★★★★★★」long double
작동하지만 부정확한 10진수 출력을 제공할 수 있습니다.
printf("%.16e", (double) now);
하면 .typeid
을 time_t
가 시스템에 정의되어 있습니다.
#include <iostream> // cout
#include <ctime> // time_t
#include <typeinfo> // typeid, name
using namespace std;
int main()
{
cout << "Test 1: The type of time_t is: \t\t"
<< typeid(time_t).name() << endl;
cout << "Test 2: time_t is a signed long?: \t"
<< (typeid(time_t) == typeid(signed long) ? "true" : "false") << endl;
cout << "Test 3: time_t is an unsigned long?: \t"
<< (typeid(time_t) == typeid(unsigned long) ? "true" : "false") << endl;
return 0;
}
시스템의 출력은 다음과 같습니다.
테스트 1: time_t의 유형은 다음과 같습니다.l테스트 2: time_t는 서명된 길이입니까?: 참테스트 3: time_t는 부호 없는 길이입니까?:거짓의
time_t
★★★★★★typedef
바이트의 경우 (8 이 )long long/__int64
가가가 OS 가가 。...을 위한 이었다.long int
(4시) 아, 아, 아, 아, 아, 맞다. '마음'을 time_t
crtdefs.h
수 만, 는 「」OS 를 사용합니다.long long
.
언급URL : https://stackoverflow.com/questions/471248/what-is-time-t-ultimately-a-typedef-to
'IT이야기' 카테고리의 다른 글
pthread_create()에 의해 호출되는 함수 인수가 여러 개입니까? (0) | 2022.06.05 |
---|---|
문자열 변수 보간 Java (0) | 2022.06.05 |
프로펠 변경 시 컴포넌트 업데이트 (0) | 2022.06.05 |
"export 'default'('_vue_script__'로 표시됨)를 '!babel-default'에서 찾을 수 없습니다. (0) | 2022.06.05 |
Vue2: 루트를 사용하여 다른 페이지로 리다이렉트하는 방법 (0) | 2022.06.05 |