C함수의 암묵적인 int 리턴 값
구글 검색을 해봤는데 이 간단한 질문에 대한 답을 찾을 수가 없는 것 같습니다.
레거시 코드 기반(최근에 Linux로 포팅되고, 새로운 컴파일러로 천천히 업데이트됨)을 작업하는 중에 많은 정보가 표시됩니다.
int myfunction(...)
{
// no return...
}
함수의 암묵적 반환 유형은 int로 알고 있지만 반환이 지정되지 않았을 때의 암묵적 반환 값은 무엇입니까?테스트를 해보니 0점이 나왔는데, 그것은 gcc에서만 가능합니다.이 컴파일러는 특정한 것입니까, 아니면 표준이 0으로 정의된 것입니까?
편집: 2017년 12월 12일 표준의 최신 버전을 참조한 수정된 답변.
89년 기준부터 새 증언에 인용된 바와 같이:
함수의 끝에서 흘러나오는 것은 식이 없는 반환과 같습니다.두 경우 모두 반환 값은 정의되지 않습니다.
이 표준은 일반적으로 기존 구현의 현장 동작을 표현합니다.
그러한 것은 가능하지만 함수의 반환 값이 절대 사용되지 않는다는 가정하에서만 가능합니다.C11 표준은 6.9.1항에 다음과 같이 기술하고 있습니다.
함수를 종료하는 }에 도달한 경우 함수 호출 값이 호출자에 의해 사용되면 동작이 정의되지 않습니다.
(AFAIR 이전 버전 표준의 문구는 유사함)
입니다에 기능을 .void
함수, 따라서 그러한 함수의 어떤 사용자도 반환 값을 사용하도록 유혹할 수 없습니다.
가 경우에도 의 끝에서 이 아닙니다.void
되지 않은 진단이 필요하지 않으며 정의되지 않은 동작이 아닙니다.
예제(정의된 동작):
int foo(void)
{
}
int main()
{
foo();
}
의 것.foo
입니다.
int bla = foo(); // undefined behavior
C 표준의 내용:
(C99, 6.9.1 페이지 12) "함수를 종료하는 }에 도달하여 함수 호출의 값이 호출자에 의해 사용되는 경우, 동작은 정의되지 않습니다."
main
입니다.와 같이 이 입니다.}
합니다에 합니다.main
다가 .return 0;
진술.
(C99 초안, 5.1.2.2.3 페이지 13) ...에 도달.
}
다를 될main
함수는 0의 값을 반환합니다.
이는 단순히 정의되지 않은 동작입니다. 반환 영역(예: x86 패밀리 프로세서의 일반적인 eax/rax)을 채우지 않으면 함수에 어떤 부작용을 통해 값이 마지막으로 설정됩니다.
를 참조하십시오. C++ 함수가 void를 반환하지 않는 경우 반환문이 필수입니까?이것은 기본적으로 이 질문의 중복입니다(C++로 태그가 지정된 것 제외).
만약에return
문장은 일관되게 값을 반환하지 않습니다. 함수는 가장 잘 변환되고 반환으로 선언됩니다.void
:
void myfunction(...)
{
...
return;
...
}
만약 몇몇이 있다면,return expr;
몇 개는return;
함수에서 문장을 지정한 다음, 어떤 것이 더 나은 동작인지 결정하고 일관성을 유지해야 합니다. 항상 값을 반환하고 유형을 다음과 같이 유지합니다.int
또는 값을 반환하지 않고 유형을 다음으로 변경하지 않습니다.void
.
반환하려면 수정된 기능을 선언해야 합니다.void
(헤더의 경우, 그렇지 않거나 그렇지 않아야 합니다.)static
기본 반환 유형(assumed 반환 유형) 이후 단일 소스 파일에 숨김)int
더 이상 유효하지 않습니다.
해당 함수에서는 항상 0일 수 있지만 대부분의 아키텍처(확실히 x86)에서는 반환문은 특정 레지스터의 내용을 호출자가 검색하여 반환 함수로 사용할 스택의 특정 위치로 이동합니다.
반환문은 전달된 변수를 해당 위치에 배치하여 다른 값이 되도록 합니다.구체적인 반품 명세서를 작성하지 않은 제 경험은 반품되는 것이 상당히 무작위적인 것이고, 동일한 것이라고 믿을 수 없다는 것입니다.
반환 유형이 그렇지 않은 함수에 대한 정의되지 않은 동작이라고 확신합니다.void
a를 생략하다return
진술.C99에는 다음과 같은 예외가 있습니다.main
, 만약에return
statement가 생략되고, 암시적으로 0을 반환하는 것으로 가정되지만, 다른 함수에는 적용되지 않습니다.
특정 플랫폼/컴파일러 조합에서 작동할 수도 있지만, 그런 특정 사항에 의존해서는 절대 안 됩니다.코드에 정의되지 않은 모든 종류의 동작을 사용하면 휴대가 불가능합니다.레거시 코드에서 정의되지 않은 동작을 보는 것은 일반적입니다.
언급URL : https://stackoverflow.com/questions/10079089/implicit-int-return-value-of-c-function
'programing' 카테고리의 다른 글
부정의 예 (0) | 2023.10.15 |
---|---|
Symfony 2.8에서 "남은 감가상각 통지" 제거 (0) | 2023.10.15 |
jQuery 유효성 확인 알림을 위해 트위터 부트스트랩 팝업을 사용하는 방법? (0) | 2023.10.15 |
Apache POI를 사용하여 Excel Sheet 복사 (0) | 2023.10.15 |
열의 조건에 따라 데이터 프레임의 행 부분 집합/필터링 (0) | 2023.10.15 |