수색…


비고

개요

C 표준은 언어 구문, 표준 라이브러리가 제공하는 기능 및 C 프로세서 (대략적으로 말하자면 컴파일러) 및 준수하는 C 프로그램의 동작을 설명합니다. 행동과 관련하여 대부분의 표준은 프로그램 및 프로세서에 대한 특정 동작을 지정합니다. 반면에 일부 작업에는 명시 적 또는 암시 적으로 정의되지 않은 동작이 있습니다 . 이러한 작업은 사용자가 아무 것도 신뢰할 수 없으므로 항상 피해야합니다. 그 사이에는 다양한 구현 정의 동작이 있습니다. 이러한 동작은 C 프로세서, 런타임 및 표준 라이브러리 (총체적으로 구현 )간에 다를 수 있지만 특정 구현에 대해 일관되고 안정적이며 일치하는 구현은 이러한 각 영역에서 동작을 문서화합니다.

프로그램이 구현 정의 동작에 의존하는 것이 때때로 합리적입니다. 예를 들어, 프로그램이 특정 운영 환경에 특정한 것이라면 그 환경에 대한 공통 프로세서에 일반적으로 구현 정의 동작을 의지하는 것이 문제가되지는 않습니다. 또는 조건부 컴파일 지시문을 사용하여 사용중인 구현에 적합한 구현 정의 동작을 선택할 수 있습니다. 어쨌든 구현을 정의한 동작이 무엇인지 파악하여이를 피하고 사용 여부 및 사용 방법에 대한 정보에 근거한 결정을 내리는 것이 중요합니다.

이 발언의 균형은 C2011 표준에 지정된 모든 구현 정의 동작 및 특성 목록을 표준에 대한 참조와 함께 구성합니다. 많은 사람들이 표준 용어를 사용 합니다 . 다른 사람들은 소스 코드를 프로그램으로 변환하는 8 단계 또는 호스트 된 구현과 독립 실행 형 구현 간의 차이와 같이 표준의 맥락에 좀 더 일반적으로 의존합니다. 특히 놀랍거나 주목할만한 것들은 굵은 활자체로 표시됩니다. 설명 된 모든 동작이 초기 C 표준에서 지원되는 것은 아니지만 일반적으로 지원하는 모든 버전의 표준에서 구현 정의 동작을 포함합니다.

프로그램 및 프로세서

일반

  • 1 바이트 ( 3.6 / 3 ) 의 비트 수입니다 . 적어도 8 , 실제 값은 매크로 CHAR_BIT 사용하여 쿼리 할 수 ​​있습니다.

  • 어떤 출력 메시지가 "진단 메시지"( 3.10 / 1 )로 간주 되는지

소스 번역

  • 물리적 소스 파일 다중 바이트 문자가 소스 문자 세트 ( 5.1.1.2/1 )에 매핑되는 방식.

  • 변환 단계 3 ( 5.1.1.2/1 ) 중에 공백이 아닌 공백이 아닌 시퀀스가 ​​단일 공백으로 대체되는지 여부

  • 그렇지 않으면 대응 문자 ( 5.1.1.2/1 )가 없을 때 문자열 상수의 문자 리터럴 및 문자가 변환 단계 5에서 변환되는 실행 집합 문자입니다.

운영 환경

  • 방출 될 진단 메시지가 식별되는 방식 ( 5.1.1.3 / 1 ).

  • 독립 실행 형 구현 ( 5.1.2.1/1 )에서 시작시 호출되는 함수의 이름과 유형입니다.

  • 지정된 최소 집합 ( 5.1.2.1 / 1 )을 초과하여 독립 실행 형으로 사용할 수있는 라이브러리 기능

  • 독립형 환경에서 프로그램 종료의 영향 ( 5.1.2.1/2 ).

  • 호스트 된 환경에서 int main(int argc, char *arg[])int main(void) ( 5.1.2.2.1 / 1 ) 이외의 main() 함수에 대해 허용 된 시그니처.

  • 호스트 된 구현이 main() ( 5.1.2.2.1 / 2 )에 대한 두 번째 인수가 가리키는 문자열을 정의하는 방식입니다.

  • 섹션 5.1.2.3 (프로그램 실행) 및 7.21.3 (파일) ( 5.1.2.3/7 )의 목적을위한 "대화 형 장치"는 무엇입니까?

  • 최적화 구현 ( 5.1.2.3 / 10 )에서 인터럽트 처리기 루틴이 참조하는 객체에 대한 모든 제한 사항.

  • 자립 구현에서는 다중 스레드 실행이 지원되는지 여부 ( 5.1.2.4/1 ).

  • 실행 문자 집합의 구성원 값 ( 5.2.1 / 1 )입니다.

  • 정의 된 알파벳 이스케이프 시퀀스 ( 5.2.2 / 3 )에 해당하는 char 값입니다.

  • 정수 및 부동 소수점 숫자 제한 및 특성 ( 5.2.4.2/1 ).

  • 부동 소수점 연산의 정확성 및 표준 부동 소수점 표현에서 문자열 표현으로의 표준 라이브러리 변환 ( 5.2.4.2.2 / 6 ).

  • 기본 부동 소수점 올림 모드 ( 5.2.4.2.2 / 8 )를 인코딩하는 매크로 FLT_ROUNDS 의 값입니다.

  • 반올림 동작은 지원되는 FLT_ROUNDS 값이 3보다 크거나 -1보다 작은 것을 특징으로합니다 ( 5.2.4.2.2 / 8 ).

  • 부동 소수점 평가 동작 ( 5.2.4.2.2 / 9 )을 특징으로하는 매크로 FLT_EVAL_METHOD 의 값입니다.

  • 지원되는 FLT_EVAL_METHOD 값이 -1 미만인 경우의 동작 ( 5.2.4.2.2 / 9 )입니다.

  • 표준 부동 소수점 형식이 비정규 숫자 ( 5.2.4.2.2 / 10 )를 지원하는지 여부를 나타내는 매크로 FLT_HAS_SUBNORM , DBL_HAS_SUBNORMLDBL_HAS_SUBNORM 의 값

유형

  • 객체가 관련 지을 수 있고 있지 않는 thread로부터 thread 저장 기간을 가지는 객체에 (간접적으로) 액세스하려고했을 때의 결과 ( 6.2.4 / 4 )

  • 기본 실행 집합 외부의 문자가 할당 된 char 값 ( 6.2.5 / 3 ).

  • 지원되는 확장 된 부호있는 정수 유형 (있는 경우) ( 6.2.5 / 4 ) 및이를 식별하는 데 사용되는 확장 키워드.

  • charsigned char 또는 unsigned char ( 6.2.5 / 15 ) 와 동일한 표현 및 동작을하는지 여부 char 가 unsigned이거나 signed 인 경우 0 또는 SCHAR_MIN CHAR_MIN 으로 질의 할 수 있습니다.

  • 객체 표현의 바이트 수, 순서 및 인코딩 (표준 ( 6.2.6.1/2 )에 명시 적으로 지정되지 않은 경우 제외)

  • 3 가지 인식 된 형태의 정수 표현 중 어느 것이 주어진 상황에서 적용되는지, 정수 객체의 특정 비트 패턴이 트랩 표현인지 여부 ( 6.2.6.2/2 ).

  • 각 유형의 정렬 요구 사항 ( 6.2.8 / 1 ).

  • 확장 된 정렬이 지원되는지 여부 ( 6.2.8 / 3 )

  • 지원되는 확장 정렬 세트 ( 6.2.8 / 4 ).

  • 정수 변환은 서로에 대해 상대적으로 확장 된 부호있는 정수 유형의 순위를 매 깁니다 ( 6.3.1.1/1 ).

  • 부호없는 정수 ( 6.3.1.3/3 )에 범위를 벗어나는 값을 할당했을 때의 효과 .

  • 범위 내에 있지만 표현할 수없는 값이 부동 소수점 객체에 할당 될 때 객체에 저장된 표현 가능한 값이 가장 가까운 두 개의 표현 가능한 값 ( 6.3.1.4/2 ; 6.3.1.5/1 ; 6.4.4.2 / 3 ).

  • 값이 0 ( 6.3.2.3/5 ) 인 정수 상수 식을 제외하고 정수를 포인터 유형으로 변환 한 결과입니다 .

원본 양식

  • 헤더 이름 토큰이 인식되는 #pragma 지시문 내의 위치 ( 6.4 / 4 ).

  • 식별자 ( 6.4.2.1/1 )에 나타날 수있는 멀티 바이트 문자, 밑줄, 초조화 라틴 문자, 범용 문자 이름 및 십진수를 제외한 문자 .

  • 식별자의 중요한 문자 수 ( 6.4.2.1/5 ).

  • 몇 가지 예외를 제외하고 정수 문자 상수의 소스 문자가 실행 세트 문자 ( 6.4.4.4/2 ; 6.4.4.4/10 )에 매핑되는 방식.

  • 와이드 문자 상수의 값을 계산하는 데 사용되는 현재 로캘 및 이러한 상수의 대부분의 다른 측면 ( 6.4.4.4/11 )입니다.

  • 다르게 접두사가 붙은 넓은 문자열 리터럴 토큰이 연결될 수 있는지 여부를 결정할 수 있으며, 그렇다면 결과로 나타나는 다중 바이트 문자 시퀀스 ( 6.4.5 / 5 )

  • 번역 단계 7에서 와이드 문자열 리터럴을 멀티 바이트 문자 시퀀스로 변환하는 데 사용되는 로캘 및 결과가 실행 문자 집합 ( 6.4.5 / 6 )에서 나타낼 수없는 경우 해당 값입니다.

  • 헤더 이름이 파일 이름 ( 6.4.7 / 2 )에 매핑되는 방식입니다.

평가

  • FP_CONTRACT 를 사용하지 않을 때 부동 소수점 표현식을 축소할지 여부 ( 6.5 / 8 )

  • sizeof_Alignof 연산자의 결과 값 ( 6.5.3.4/5 )

  • 포인터 뺄셈의 결과 유형 크기 ( 6.5.6 / 9 ).

  • 부호있는 정수를 음수 값 ( 6.5.7 / 5 ) 으로 오른쪽 시프트 한 결과입니다 .

런타임 동작

  • register 키워드가 유효한 범위 ( 6.7.1 / 6 ).

  • int 로 선언 된 비트 필드의 유형이 unsigned int 또는 signed int ( 6.7.2 / 5 )와 같은 유형인지 여부

  • 선택적으로 정규화 된 _Bool , signed intunsigned int 이외의 어떤 비트 필드 유형이 사용될 수 있습니다. 비트 필드가 원자 유형을 가질 수 있는지 여부 ( 6.7.2.1/5 ).

  • 구현이 비트 필드 용 스토리지를 배치하는 방법의 측면 ( 6.7.2.1 / 11 ).

  • 구조체와 노동 조합의 비 비트 필드 멤버 정렬 ( 6.7.2.1/14 ).

  • 각 열거 형 ( 6.7.2.2/4 )의 기본 유형입니다.

  • volatile -qualifed 유형 ( 6.7.3 / 7 )의 객체에 대한 "액세스"를 구성하는 것은 무엇입니까?

  • inline 함수 선언의 효율성 ( 6.7.4 / 6 ).

전처리 기

  • 문자 상수가 일반 표현식에서와 같이 전 처리기 조건부에서 동일한 방식으로 정수 값으로 변환되는지, 단일 문자 상수가 음수 값 ( 6.10.1 / 4 )을 가질 수 있는지 여부.

  • 위치는 #include 지시문 ( 6.10.2 / 2-3 )에 지정된 파일을 검색합니다.

  • 다중 토큰 #include 지시문 ( 6.10.2 / 4 )의 토큰에서 헤더 이름을 형성하는 방식입니다.

  • #include 중첩 포함 제한 ( 6.10.2 / 6 ).

  • 선행 처리기의 # 연산자 ( 6.10.3.2/2 )의 결과에서 범용 문자 이름을 \ 앞에 넣기 전에 \ 문자가 삽입되는지 여부.

  • STDC ( 6.10.6 / 1 )가 아닌 pragma에 대한 #pragma preprocessing 지시문의 동작입니다.

  • 변환 날짜 나 시간이없는 경우 __DATE____TIME__ 매크로의 값 ( 6.10.8.1/1 )을 사용할 수 있습니다.

  • 매크로 __STDC_ISO_10646__ 이 정의되지 않은 경우 wchar_t 사용되는 내부 문자 인코딩 ( 6.10.8.2/1 ).

  • 매크로 __STDC_UTF_32__ 이 정의되지 않은 경우 char32_t 사용되는 내부 문자 인코딩 ( 6.10.8.2/1 ).

표준 라이브러리

일반

  • 어설 션이 실패 할 때 방출되는 메시지의 형식 ( 7.2.1.1/2 ).

부동 소수점 환경 함수

  • 표준에 정의 된 것 이상의 추가 부동 소수점 예외 ( 7.6 / 6 ).

  • 표준에 정의 된 것 이외의 추가 부동 소수점 반올림 모드 ( 7.6 / 8 ).

  • 표준에 정의 된 것 이상의 추가 부동 소수점 환경 ( 7.6 / 10 ).

  • 부동 소수점 환경 액세스 스위치 ( 7.6.1 / 2 )의 기본값입니다.

  • fegetexceptflag() ( 7.6.2.2/1 )에 의해 기록 된 부동 소수점 상태 플래그의 표현입니다.

  • feraiseexcept() 함수가 "오버플로"또는 "언더 플로우"부동 소수점 예외 ( 7.6.2.3/2 )를 올릴 때마다 "부정확 한"부동 소수점 예외를 추가로 제기할지 여부.

로케일 관련 함수

  • setlocale() ( 7.11.1.1/3 )에서 지원하는 "C" 이외의 로켈 문자열.

수학 함수

  • FLT_EVAL_METHOD 매크로의 값이 0 , 12 ( 7.12 / 2 )가 double_t 경우 float_tdouble_t 나타내는 유형입니다.

  • 표준 ( 7.12 / 6 )에 정의 된 것 이상의 지원되는 부동 소수점 분류.

  • 도메인 오류 ( 7.12.1 / 2 )가 발생하면 math.h 함수가 반환하는 값이 반환됩니다.

  • 폴 오류 ( 7.12.1 / 3 )가 발생하면 math.h 함수가 반환하는 값이 반환됩니다.

  • 결과가 언더 플로 할 때 math.h 함수가 반환하는 값과 errnoERANGE 로 설정되었는지 여부 및 이러한 상황 ( 7.12.1 / 6 )에서 부동 소수점 예외가 발생하는지 여부를 나타냅니다.

  • FP 수축 스위치 ( 7.12.2 / 2 )의 기본값입니다.

  • fmod() 함수가 0을 반환하는지 또는 두 번째 인수가 0 일 때 도메인 오류가 발생하는지 여부 ( 7.12.10.1/3 )

  • remainder() 함수가 0을 반환하는지 또는 두 번째 인수가 0 일 때 도메인 오류가 발생하는지 여부 ( 7.12.10.2/3 )

  • remquo() 함수 ( 7.12.10.3 / 2 )에 의해 계산 된 지수 모듈의 유효 비트 수입니다.

  • remquo() 함수가 0을 반환하는지 또는 두 번째 인수가 0 일 때 도메인 오류가 발생하는지 여부 ( 7.12.10.3/3 )

신호

  • 지원되는 신호의 전체 집합, 그 의미 및 기본 처리 ( 7.14 / 4 ).

  • 신호가 발생하고 해당 신호와 연관된 사용자 지정 처리기가있는 경우 처리기 ( 7.14.1.1/3 )의 실행 기간 동안 차단되는 신호가있는 경우 해당 신호를 차단합니다.

  • SIGFPE , SIGILLSIGSEGV 이외의 신호는 사용자 정의 신호 처리기에서 반환 될 때 동작이 정의되지 않도록합니다 ( 7.14.1.1/3 ).

  • 어떤 신호가 처음에는 무시되도록 구성됩니다 (기본 처리 7.14.1.1/6에 관계없이).

여러 가지 잡다한

  • 매크로가 NULL 확장되는 특정 널 포인터 상수 ( 7.19 / 3 ).

파일 처리 함수

  • 텍스트 스트림의 마지막 줄에 종료 줄 바꿈이 필요한지 여부 ( 7.21.2 / 2 )

  • 바이너리 스트림 ( 7.21.2 / 3 )에 자동으로 추가 된 null 문자 수.

  • 추가 모드 ( 7.21.3 / 1 )에서 열린 파일의 초기 위치입니다.

  • 텍스트 스트림에 대한 쓰기로 인해 스트림이 잘 리게되는지 여부 ( 7.21.3 / 2 )

  • 스트림 버퍼링 ( 7.21.3 / 3 ) 지원.

  • 길이가 0 인 파일이 실제로 존재하는지 여부 ( 7.21.3 / 4 ).

  • 유효한 파일 이름 작성 규칙 ( 7.21.3 / 8 ).

  • 동일한 파일을 동시에 여러 번 열 수 있는지 여부 ( 7.21.3 / 8 ).

  • 멀티 바이트 문자 ( 7.21.3 / 10 )의 인코딩 및 특성 선택

  • 대상 파일이 열려있을 때 remove() 함수의 동작입니다 ( 7.21.4.1/2 ).

  • 대상 파일이 이미있는 경우 rename() 함수의 동작 ( 7.21.4.2/2 ).

  • 프로그램이 비정상적으로 종료되는 경우 tmpfile() 함수를 통해 생성 된 파일이 제거되는지 여부 ( 7.21.4.3/2 ).

  • 어떤 상황에서 freopen() ( 7.21.5.4/3 )을 통해 어떤 모드가 변경 될 수 있습니까 ?

I / O 기능

  • 무한 및 비표준 FP 값의 허용 된 표현은 printf () - family 함수 ( 7.21.6.1/8 )에 의해 생성됩니다.

  • 포인터가 printf() -family 함수 ( 7.21.6.1/8 )에 의해 포맷되는 방식.

  • - 문자가 [ 필드 ( 7.21.6.2/12 )의 스캔 목록의 내부 위치에 나타날 때 scanf() 가족 함수의 동작.

  • scanf() -family 함수의 대부분은 p 필드를 전달합니다 ( 7.21.6.2/12 ).

  • 실패시 ( 7.21.9.1/2 ) fgetpos() 에 의해 설정된 errno 값입니다.

  • 실패시 fsetpos() 에 의해 설정된 errno 값 ( 7.21.9.3/2 ).

  • 실패시 ftell() 에 의해 설정된 errno 값입니다 ( 7.21.9.4/3 ).

  • strtod() 대한 의미 - NaN 형식화 ( 7.22.1.3p4 )의 지원되는 일부 기능.

  • 결과가 언더 플로우 할 때 strtod() -family 함수가 errnoERANGE 설정하는지 여부 ( 7.22.1.3/10 ).

메모리 할당 기능

  • 요청 된 바이트 수가 0 ( 7.22.3 / 1 ) 일 때 메모리 할당 함수의 동작.

시스템 환경 기능

  • abort() 함수가 호출 될 때 클린업 (있는 경우)이 수행되고 호스트 OS에 반환되는 상태 ( 7.22.4.1/2 ).

  • exit() 가 호출 될 때 호스트 환경에 반환되는 상태 ( 7.22.4.4/5 ).

  • 열린 스트림 처리 및 _Exit _Exit() 이 호출 될 때 호스트 환경에 반환되는 상태 ( 7.22.4.5/2 ).

  • getenv() 및 환경 변경 방법 ( 7.22.4.6/2 )을 통해 액세스 할 수있는 환경 이름 집합입니다.

  • system() 함수의 반환 값 ( 7.22.4.8/3 )입니다.

날짜 및 시간 함수

  • 현지 시간대 및 일광 절약 시간 ( 7.27.1 / 1 ).

  • clock_ttime_t 유형 ( 7.27.1 / 4 )을 통해 표현할 수있는 시간 범위 및 정밀도.

  • clock() 함수 ( 7.27.2.1/3 )가 반환 한 시간의 참조로 사용되는 시대의 시작입니다.

  • timespec_get() 함수에 의해 반환 된 시간에 대한 참조로 사용되는 신기원의 시작입니다 (시간 기준이 TIME_UTC , 7.27.2.5/3 ).

  • "C"로켈 ( 7.27.3.5/7 )에서 %Z 변환 지정자에 대한 strftime() 대체.

넓은 문자 I / O 기능

  • 무한 수 및 무수 부의 FP 값의 허용 된 표현은 wprintf() -family 함수 ( 7.29.2.1/8 )에 의해 생성됩니다.

  • 포인터가 wprintf() -family 함수 ( 7.29.2.1/8 )에 의해 형식화되는 방식.

  • wscanf() -family 함수는 - 문자가 [ 필드 ( 7.29.2.2/12 )의 스캔 목록의 내부 위치에 나타날 때 작동합니다.

  • wscanf() -family 함수의 대부분은 p 필드를 전달합니다 ( 7.29.2.2/12 ).

  • wstrtod() 의 의미 - NaN 형식화 ( 7.29.4.1.1 / 4 )의 지원되는 일부 기능.

  • 결과가 언더 플로우 할 때 wstrtod() -family 함수가 errnoERANGE 설정하는지 여부 ( 7.29.4.1.1 / 10 ).

음의 정수의 오른쪽 시프트

int signed_integer = -1;

// The right shift operation exhibits implementation-defined behavior:
int result = signed_integer >> 1;

정수에 범위를 벗어나는 값 할당

// Supposing SCHAR_MAX, the maximum value that can be represented by a signed char, is
// 127, the behavior of this assignment is implementation-defined:
signed char integer;
integer = 128;

0 바이트 할당

// The allocation functions have implementation-defined behavior when the requested size
// of the allocation is zero.
void *p = malloc(0);

부호있는 정수의 표현

각 부호가있는 정수 유형은 세 가지 형식 중 하나로 표현 될 수 있습니다. 어떤 것이 사용되는지는 구현에 따라 정의됩니다. 주어진 부호있는 정수 유형에 대해 int 와 적어도 동일하게 사용되는 구현은 다음과 같이 해당 유형의 값 -1 표현에있는 두 개의 최하위 비트에서 런타임에 결정될 수 있습니다.

enum { sign_magnitude = 1, ones_compl = 2, twos_compl = 3, };
#define SIGN_REP(T) ((T)-1 & (T)3)

switch (SIGN_REP(long)) {
   case sign_magnitude: { /* do something */ break; }
   case ones_compl:     { /* do otherwise */ break; }
   case twos_compl:     { /* do yet else  */ break; }
   case 0:  { _Static_assert(SIGN_REP(long), "bogus sign representation"); }
}

동일한 패턴이 더 좁은 유형의 표현에도 적용되지만 결과가 계산되기 전에 & 의 피연산자가 "일반적인 산술 변환"의 영향을 받기 때문에이 기법으로는 테스트 할 수 없습니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow