IT TIP

선언되었지만 C ++에서 정의되지 않은 정적 함수

itqueen 2020. 11. 29. 12:49
반응형

선언되었지만 C ++에서 정의되지 않은 정적 함수


C ++를 사용하는 다음 코드에서 오류가 발생합니다.

Main.cpp

#include "file.h"

int main()
{
   int k = GetInteger();
   return 0;
}

File.h

static int GetInteger();

File.cpp

#include "file.h"

static int GetInteger()
{
   return 1;
}

내가 얻는 오류 :

Error C2129: static function 'int GetInteger(void)' declared but not defined.

유명한 기사 "Organizing Code File in C and C ++"를 읽었 지만이 코드의 문제점을 이해하지 못합니다.


C ++ static에서 전역 / 네임 스페이스 범위에서 함수 / 변수는 정의 된 번역 단위에서만 사용되며 다른 번역 단위에서는 사용되지 않습니다.

여기에서 Main.cpp정의 된 번역 단위 ( ) 와 다른 번역 단위 ( ) 의 정적 함수를 사용하려고합니다 File.cpp.

제거하면 static제대로 작동합니다.


변화

static int GetInteger();

...에

int GetInteger();

static이 경우 내부 연결 메서드를 제공합니다 . 즉, 정의한 번역 단위에서만 사용할 수 있습니다.

당신은 그것을에서 정의하고 그것을 File.cpp사용하려고 시도 main.cpp하지만 main은 당신이 그것을 선언했기 때문에 그것에 대한 정의가 없습니다 static.


이 경우 static함수 이름에 내부 연결이 있음을 의미하기 때문입니다. 그게 GetInteger하나 개의 번역 단위에 관련이없는 GetInteger다른 번역 단위입니다. 키워드 static는 오버로드됩니다. 어떤 경우에는 수명에 영향을 미치고 다른 경우에는 바인딩에 영향을 미칩니다. "정적"이 평생의 이름이기도하므로 여기서는 특히 혼란 스럽습니다. 네임 스페이스 범위에서 선언 된 함수 및 데이터는 항상 정적 수명을 갖습니다. static선언에 나타날 외부 대신 내부 바인딩이 발생합니다.


static으로 선언 된 함수는 포함하는 파일에 로컬입니다. 따라서 함수를 호출하는 파일과 동일한 파일에 함수를 정의해야합니다. 다른 파일에서 호출 가능하게하려면 정적으로 선언해서는 안됩니다.


내 이해에 따르면 정적 함수는 정의 된 파일 이름으로 이름이 변경되므로 main.cpp에 file.h를 포함하면 getInteger ()가 file.cpp에 GetInteger ()를 정의했지만 main.cpp로 변경됩니다. 정적이기 때문에이 이름의 함수가 존재하지 않기 때문에 링커도 GetInteger ()의 정의를 찾을 수 없습니다.

나는 교훈이 인터페이스의 일부가 아니기 때문에 헤더 파일에서 정적 함수를 선언하지 않는다고 생각합니다.


모든 것이 동일한 번역 단위에 있으면 작동합니다. 아마도 File.cpp를 Main.cpp와 동일한 단위로 컴파일하지 않았을 것입니다.

g++ -Wall File.cpp Main.cpp

각 파일이 개별적으로 컴파일되는 경우 함수는 extern다른 번역 단위에서 사용 되도록 만들어야 합니다.

extern int GetInteger();

이것은

int GetInteger();

참고 URL : https://stackoverflow.com/questions/10812769/static-function-declared-but-not-defined-in-c

반응형