C Language
구현 정의 동작
수색…
비고
개요
C 표준은 언어 구문, 표준 라이브러리가 제공하는 기능 및 C 프로세서 (대략적으로 말하자면 컴파일러) 및 준수하는 C 프로그램의 동작을 설명합니다. 행동과 관련하여 대부분의 표준은 프로그램 및 프로세서에 대한 특정 동작을 지정합니다. 반면에 일부 작업에는 명시 적 또는 암시 적으로 정의되지 않은 동작이 있습니다 . 이러한 작업은 사용자가 아무 것도 신뢰할 수 없으므로 항상 피해야합니다. 그 사이에는 다양한 구현 정의 동작이 있습니다. 이러한 동작은 C 프로세서, 런타임 및 표준 라이브러리 (총체적으로 구현 )간에 다를 수 있지만 특정 구현에 대해 일관되고 안정적이며 일치하는 구현은 이러한 각 영역에서 동작을 문서화합니다.
프로그램이 구현 정의 동작에 의존하는 것이 때때로 합리적입니다. 예를 들어, 프로그램이 특정 운영 환경에 특정한 것이라면 그 환경에 대한 공통 프로세서에 일반적으로 구현 정의 동작을 의지하는 것이 문제가되지는 않습니다. 또는 조건부 컴파일 지시문을 사용하여 사용중인 구현에 적합한 구현 정의 동작을 선택할 수 있습니다. 어쨌든 구현을 정의한 동작이 무엇인지 파악하여이를 피하고 사용 여부 및 사용 방법에 대한 정보에 근거한 결정을 내리는 것이 중요합니다.
이 발언의 균형은 C2011 표준에 지정된 모든 구현 정의 동작 및 특성 목록을 표준에 대한 참조와 함께 구성합니다. 많은 사람들이 표준 용어를 사용 합니다 . 다른 사람들은 소스 코드를 프로그램으로 변환하는 8 단계 또는 호스트 된 구현과 독립 실행 형 구현 간의 차이와 같이 표준의 맥락에 좀 더 일반적으로 의존합니다. 특히 놀랍거나 주목할만한 것들은 굵은 활자체로 표시됩니다. 설명 된 모든 동작이 초기 C 표준에서 지원되는 것은 아니지만 일반적으로 지원하는 모든 버전의 표준에서 구현 정의 동작을 포함합니다.
프로그램 및 프로세서
일반
1 바이트 ( 3.6 / 3 ) 의 비트 수입니다 . 적어도
8
, 실제 값은 매크로CHAR_BIT
사용하여 쿼리 할 수 있습니다.
소스 번역
물리적 소스 파일 다중 바이트 문자가 소스 문자 세트 ( 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_SUBNORM
및LDBL_HAS_SUBNORM
의 값
유형
객체가 관련 지을 수 있고 있지 않는 thread로부터 thread 저장 기간을 가지는 객체에 (간접적으로) 액세스하려고했을 때의 결과 ( 6.2.4 / 4 )
기본 실행 집합 외부의 문자가 할당 된
char
값 ( 6.2.5 / 3 ).지원되는 확장 된 부호있는 정수 유형 (있는 경우) ( 6.2.5 / 4 ) 및이를 식별하는 데 사용되는 확장 키워드.
char
가signed 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 int
및unsigned 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
,1
및2
( 7.12 / 2 )가double_t
경우float_t
및double_t
나타내는 유형입니다.표준 ( 7.12 / 6 )에 정의 된 것 이상의 지원되는 부동 소수점 분류.
도메인 오류 ( 7.12.1 / 2 )가 발생하면
math.h
함수가 반환하는 값이 반환됩니다.폴 오류 ( 7.12.1 / 3 )가 발생하면
math.h
함수가 반환하는 값이 반환됩니다.결과가 언더 플로 할 때
math.h
함수가 반환하는 값과errno
가ERANGE
로 설정되었는지 여부 및 이러한 상황 ( 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
,SIGILL
및SIGSEGV
이외의 신호는 사용자 정의 신호 처리기에서 반환 될 때 동작이 정의되지 않도록합니다 ( 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 함수가errno
를ERANGE
설정하는지 여부 ( 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_t
및time_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 함수가errno
를ERANGE
설정하는지 여부 ( 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"); }
}
동일한 패턴이 더 좁은 유형의 표현에도 적용되지만 결과가 계산되기 전에 &
의 피연산자가 "일반적인 산술 변환"의 영향을 받기 때문에이 기법으로는 테스트 할 수 없습니다.