2014-06-14 1 views
0

size_t는 부호가 없으므로 음수 값이 허용되지 않습니다. time_t는 최상의 지식을 가진 것으로, -1을 할당 할 수 있습니다. size_t에. 그러나 time_t에 대해서는 완전히 확신하지 못합니다. 내가 헤더 파일을 통해 정의를 따른다면 나는 여기까지 : 여기에std :: string을 comparable * time * 파서에 쓰십시오. 실패 할 수도 있습니다.

typedef __time_t time_t; 

:

__STD_TYPE __TIME_T_TYPE __time_t; /* Seconds since the Epoch. */ 

마지막

#define __TIME_T_TYPE  __SYSCALL_SLONG_TYPE 

내가 너무 확실하지 않다 무엇 __SYSCALL_SLONG_TYPE이 맞지만, 이고 길이가이라고 생각됩니다. 불행히도,이 추적을 한 후에도 다른 C++ 11 플랫폼에서도 동일한 구현이 이루어 지길 바랍니다. 나는 아직도이 법적, 그들 모두 잘 정의 될 것이라고 확실하지 않다 :

예를 모델링하는 일이, 음의 시간 오프셋을 가질 수 있기 때문에이하는 time_t 서명 할 말이 물론
size_t foo = -1; 

시간대. 하지만 다른 한편으로는 1970 년 이후로 세는 데는 많은 시간이 걸리기 때문에 부호가없는 것이 당연합니다. 그래서 상식은 두 가지로 진행됩니다. time_t에서 인터넷 검색이 반환되었습니다 :

"역사적인 이유로 인해 일반적으로 1970 년 1 월 1 일 00시 (UTC) 이후로 경과 된 초 수를 나타내는 정수 값으로 구현됩니다 (즉, 유닉스 타임 스탬프). 라이브러리는 대체 시간 표현을 사용하여이 유형을 구현할 수 있습니다. "

출처 :

과 같은 페이지에 http://www.cplusplus.com/reference/ctime/time_t/ ". 휴대용 프로그램이 직접이 유형의 값을 사용하지만, 항상 휴대 종류로 변환하는 표준 라이브러리의 요소에 대한 호출에 의존하지 말아야"

그래서 time_t는 모든 시스템에서 잘 정의되어 있지 않지만 time()은 time_t를 반환하므로 인터페이스에서 내 보내면 처음이 아닙니다. 어떤 다른 유형을 사용해야합니까? 더 바이트를 가지고로, 속도가 느린 구조체 TM처럼 구조체를 사용하기 때문에 그것을 복사하거나 다른 구조체와 비교 :

  • 속도 :

    나는이 두 가지 이유 부탁 해요 시간이 오래 걸릴 때보 다 느려집니다.

  • 주문 : 날짜에 대한 빠른 데이터 형식을 갖고 싶습니다. < b를 사용하여 a와 b 중 어느 것이 먼저 오는지 파악할 수 있습니다.

질문 : time_t가 휴대용 (1) 빠르고 (2) 비교 내가 사용되는 데이터 타입의 종류를 모든 플랫폼에서 잘 정의 된 시간 표현이 아닌 때문에? 모든 플랫폼에서 때묻지

#include <iostream> 
#include <ctime> 
#include <cstring> 

int main() { 
    struct tm tm_a, tm_b; 
    memset(&tm_a, 0, sizeof(struct tm)); 
    memset(&tm_b, 0, sizeof(struct tm)); 
    if(strptime("2014-01-01 12:00:00", "%Y-%m-%d %H:%M:%s", &tm_a) && strptime("2014-01-01 11:59:59", "%Y-%m-%d %H:%M:%s", &tm_b)) { 
     if(mktime(&tm_a) > mktime(&tm_b)) std::cout << "time_t ordering OK." << std::endl; 
     else std::cout << "time_t ordering tainted" << std::endl; 
    } else std::cout << "failed to parse time" << std::endl; 
    return 0; 
} 

은 time_t 것 : time_t의 순서에 대한 예를 들어

?

+5

그럼 당신의 질문은 무엇입니까 – pippin1289

+0

주저하지 않을 것에 대해 사과 드리겠습니다 잠시만 기다려주십시오 – Herbert

+0

이 문제를 받아 들일 수있는 질문으로 생각하십니까 – Herbert

답변

4

(time_t)(-1)은 실제로 time_t에 관계없이 "이것은 유효한 시간이 아닙니다"를 의미합니다. mktime 표준 함수는 오류가 발생하면이 값을 반환하므로 사용할 수 있습니다.

C 및 C++ 표준은 time_t에서 시간 인코딩에 대해 아무런 언급이 없습니다. difftimedouble의 두 시간 사이의 시간 차이를 초 단위로 계산하며 time_t으로 표시되며 이는 축순으로 time_t 값을 주문하는 유일한 축복 된 방법입니다. 그러나 POSIX 표준은 time_t을 초 단위로 지정하므로 POSIX 시스템에서는 time_t을 직접 <과 비교해도됩니다.

C와 POSIX는 모두 time_t이 정수가 아닌 임의의 산술 유형이 될 수 있습니다.

+0

당신은이 답변을 주셔서 감사합니다. 처음부터 진짜 질문은 "<연산자"에 따라 time_t 유형을 순서대로 나열하는 것입니다. – Herbert

+0

기본적으로, 나는 time_t의 서로 다른 (수학적) 속성들이 순서와 음수 값을 사용하는 것과 같은 ** 크로스 플랫폼 **이 어떤지 궁금합니다. – Herbert

+1

제 질문을 재 해석하고 difftime()을 추가해 주셔서 감사합니다. 그건 내 주문 문제에 대한 아주 유효한 해결책입니다. – Herbert

1

다른 플랫폼간에 이식 가능한 시간 표시가 필요한 경우 사용하는 플랫폼 간의 차이점을 처리하는 라이브러리를 사용하거나 만들어야합니다.

예를 들어 Boost.Date_Time과 같이 지원되는 모든 표현을 선택할 수 있습니다. 심지어 플랫폼에 독립적 인 방법으로 (boost가 지원하는 모든 플랫폼에서) seconds elapsed since epoch을 사용할 수도 있습니다.

+0

외부 라이브러리 솔루션 대신 C++/c 솔루션이기 때문에 accept를 difftime으로 이동했습니다. 그래도 좋은 제안을 해주셔서 감사합니다! – Herbert

0

나는 optional에 중독되어 있습니다 (부스트를 통해 또는 C++ 1y tr 작업 용지를 기반으로 자신을 롤업).

optional<foo>foo 또는 nullopt입니다. 설명을 통해 foo에 액세스하지만 데이터는 합집합을 통해 optional 내에 저장됩니다. 그 사소한 디버깅 수있다.

내 게으른 implememtation이 (가) '그 것이다에 대한 포인터를 사용하는 foo 여부는 "그것은 모두 플래그 값보다 더 나은 실패를 전달, 포인터 기반 내가 쓰는 코드에 신고 한 무리를 대체합니다.

관련 문제