2011-02-16 6 views
5

나는 stdio.h 파일을 읽고 혼란 스럽다.함수 선언의 의미

예를 들어

는,이 라인이 : 내가 아는

_CRTIMP FILE* __cdecl __MINGW_NOTHROW fopen (const char*, const char*); 

"파일 *는"유형을 반환하는 의미와 나는 taht를 _CRTIMP가

# ifndef _CRTIMP 
# define _CRTIMP __declspec(dllimport) 
# endif 

로 정의 일정 찾았지만 어쨌든 그것을 이해 해달라고 , 그게 뭐야? 나머지 문자열 (__cdecl, __MINGW_NOTHROW)은 무엇입니까?

답변

5

__declspec(dllimport)은 별도의 dll에서 함수를 가져 오도록 지정합니다. CRT 정적/동적 연결 설정에 따라 다른 방식으로 정의되어 있다고 가정합니다.

__cdecl은 함수에 사용되는 호출 규칙입니다. 호출 규칙은 함수가 호출 될 것을 기대하는 방법을 컴파일러에게 알려준다. (순서 매개 변수는 스택에 푸시된다. 매개 변수에 레지스터가 사용되고, 반환 값이 저장되며, 스택 정리를 담당한다.); 일반적으로 라이브러리를 작성하지 않는 한 걱정할 필요가 없습니다.

__MINGW_NOTHROW__attribute__ ((__nothrow__))으로 확장되며, 이는 해당 함수가 예외를 throw하지 않을 것이라고 컴파일러에 알리는 MinGW 관련 확장입니다. 이것은 컴파일러가 몇 가지 최적화를 수행하게합니다.

이러한 것들은 모두 표준 C 속성이 아니라 컴파일러/플랫폼 특정 사항입니다. 다시 말하지만 일반적으로 걱정할 필요는 없습니다. CRT를 잘 작동시켜야합니다. 그러나 라이브러리를 만들지 않는 한, 라이브러리에 대해 알지 못해도 벗어날 수 있습니다.:)

1

__declspec(dllimport)은 DLL에서이 함수를 가져와야한다는 것을 컴파일러에 알립니다.이 함수는 Windows 관련 확장입니다. 자세한 내용은 this page을 참조하십시오.

마찬가지로, __cdecl은 함수가 특정 호출 규칙 (즉, C에서 사용하는 규칙)을 사용하도록 지정하는 속성입니다. this page을 참조하십시오.

__MINGW_NOTHROW 매크로는 해당 함수가 예외를 throw 할 수 없다는 것을 컴파일러에 알리는 GCC nothrow 특성의 동의어입니다. 자세한 내용은 documentation을 참조하십시오.

0

이 문서는 사용하는 환경이나 컴파일러에 특정한 선언문입니다.

  • __declspec(dllimport)은이 기능이 dll에 있으며 생성 된 실행 가능한 PE 파일의 가져 오기 테이블에 있어야 함을 나타냅니다.
  • __cdecl은 표준 C 호출 규칙을 나타내며 컴파일러가이 호출 규칙을 준수하도록 함수를 변형하는 방법을 수정합니다.
  • __MINGW_NOTHROW은 컴파일러에 따라 다르며 예외 지원을 비활성화 할 수 있습니다.

모든 경우에 컴파일러의 설명이 있어야합니다.

4

당신은 _mingw.h에서 모양과 gcc manual를 취해야한다 : GCC의 경우 - 또는 어떤 다른 컴파일러 __GNUC__ 지원 - 다음과 같은 정의가 적용

#define __cdecl __attribute__ ((__cdecl__)) 
#define __MINGW_NOTHROW __attribute__ ((__nothrow__)) 

전자는 cdecl 86을 사용하는 컴파일러를 알려줍니다 호출 규칙 (see gcc manual), 후자는 C++ 예외 (see gcc manual)를 throw하지 않도록 보장됩니다.

__declspec(dllimport)은 동적 연결 작업을 수행하는 데 필요합니다 (see gcc manual).