programing

외부 함수와 C++의 비교

kingscode 2022. 9. 1. 23:31
반응형

외부 함수와 C++의 비교

»*.h의 헤더 C시, 라이브러리

extern void f();

// or only 

void f();
  1. 「 」에서만 C
  2. 에서 C++.

키워드를 externC 또는 C++ 중 하나에서 함수를 선언할 때 사용합니다.C 및 C++에서는 기본적으로 모든 함수에 외부 링크가 있습니다. .extern아마 역사적인 뿌리가 있겠지만, 이미 수십 년 동안 전혀 관련이 없었습니다.

에는 [하나 과 직접 되지 않을 것입니다.언어(C99에서는 일부 가 CΩ으로 되어 있는 [obscure?]예외가 하나 있습니다.이것은 아마 질문 내용과 직접 관련되지 않을 것입니다.C 언어(C99)에서는 일부 번역 단위에서 함수가 다음과 같이 정의되어 있는 경우:inline을 했습니다.extern(명시적(명시적)extern이 경우 해당 함수의 인라인 정의도 외부 정의로 기능합니다.명시적 선언이 없는 경우extern는 변환 유닛에 존재하며 인라인 정의는 "내부" 정의로만 사용됩니다.

이런 게 extern "C"지지만른

C 라이브러리의 헤더 파일에서는 다음 함수를 선언해야 합니다.

extern void f();
// or only
void f();

문제 1: 의미론

C++ 프로그램에서 함수는 값을 반환하지 않고 인수를 받지 않는 함수로 선언됩니다.

C 프로그램에서 함수는 값을 반환하지 않는 함수로 선언되며 가변길이의 인수가 아닌 불확정 리스트를 취한다.

C에서 'no arguments'의 의미를 얻으려면 다음 중 하나를 사용합니다.

extern void f(void);
void f(void);

표기는 C++ 에서는 「C++」를 사용해 합니다.void('C++')

문제 2: C와 C++ 사이의 인터워킹

C++ 에는 C++ 코드입니다.extern "C"그해 볼 필요가 있습니다.__cplusplus매크로. 보통 이렇게 하죠.

#ifdef __cplusplus
#define EXTERN_C       extern "C"
#define EXTERN_C_BEGIN extern "C" {
#define EXTERN_C_END   }
#else
#define EXTERN_C       /* Nothing */
#define EXTERN_C_BEGIN /* Nothing */
#define EXTERN_C_END   /* Nothing */
#endif

EXTERN_C void f(void);

EXTERN_C_BEGIN
    void f(void);
    int  g(int);
EXTERN_C_END

옵션과 바리에이션은 다양하지만 헤더는 C와 C++ 모두에서 사용할 수 있습니다.

일반적으로 매크로는 모든 곳에서 사용되는 하나의 범용 헤더에 정의되며, 그 후 특정 헤더는 범용 헤더가 포함되도록 보장하고 매크로의 적절한 형식을 사용합니다.

문제 3: 스타일

형식상, 이 명령어는 필요 없습니다.extern함수 선언 전 표기법.단, 외부에서 정의된 함수의 선언임을 강조하기 위해 헤더에 글로벌 변수가 선언된 경우와의 대칭성을 위해 사용합니다.

사람들은 이에 동의하지 않을 수 있습니다.저는 현지 규칙을 따르지만 제가 규칙 입안자라면extern는 헤더에 포함되어 있습니다.

일반 사용의 경우 다음과 같이 신고합니다.

#ifdef __cplusplus
extern "C" {
#endif
  void f(void);
#ifdef __cplusplus
}
#endif

그렇지않으면,extern는 사용되지 않습니다.

후자는 기능 정의일 뿐이므로 '이 근처에 시제품이 있는 기능이 있습니다'라는 헤더를 포함하는 사용자에게만 알려줍니다.

이러한 맥락에서 함수는 변수와 분명히 다르지만, 그것은 다른 문제입니다.단, 함수 본문을 '인라인'으로 선언하거나 클래스 정의(C++)의 일부 또는 '템플릿 함수'(C++)로 선언하지 않는 한 함수 본문을 포함하지 않도록 하십시오.

함수 프로토타입에서 외부 지정은 기본적으로 가정되어 있으므로 아무런 효과가 없습니다.컴파일러는 프로토타입을 볼 때마다 함수가 다른 곳(현재 또는 다른 변환 단위)에서 정의되어 있다고 가정합니다.이것은 두 언어 모두에 해당된다.

다음 스레드에는 일반적으로 외부와 관련된 유용한 코멘트가 있습니다.

extern 키워드가 C 함수에 미치는 영향

언급URL : https://stackoverflow.com/questions/11712707/extern-functions-in-c-vs-c

반응형