IT이야기

C/C++: 헤더 파일의 정적 함수, 무슨 의미입니까?

cyworld 2022. 6. 28. 23:25
반응형

C/C++: 헤더 파일의 정적 함수, 무슨 의미입니까?

소스 파일에서 정적 함수가 선언되었을 때 어떤 의미인지 알고 있습니다.코드를 읽고 있는데, 헤더 파일의 정적 함수가 다른 파일에서 호출될 수 있습니다.

헤더 파일에 함수가 정의되어 있습니까?따라서 실제 코드는 다음과 같이 함수로 직접 지정됩니다.

static int addTwo(int x)
{
  return x + 2;
}

그렇다면 그것은 많은 다른 C 파일에 유용한 기능을 제공하는 한 가지 방법일 뿐입니다.헤더를 포함하는 각 C 파일은 호출할 수 있는 자체 정의를 가져옵니다.이것은 메모리를 낭비하는 것은 물론, (내 생각에) 실행 가능한 코드를 헤더에 넣는 것은 일반적으로 좋은 생각이 아니기 때문에 하기에는 매우 불쾌한 일입니다.

하세요.#include: 헤더는 기본적으로 헤더 내용(및 헤더에 포함된 다른 헤더)을 컴파일러에 의해 인식되는 대로 C 파일에 붙여넣습니다.컴파일러는 특정 함수 정의가 헤더 파일에서 나왔다는 것을 결코 알지 못합니다.

업데이트: 대부분의 경우 위와 같은 작업을 수행하는 것이 좋습니다.이것에 대해, 제 대답은 매우 알기 쉽게 들립니다.이것은 다소 심플한 것입니다.예를 들어, 고유 함수를 모델링(또는 단순히 사용)하는 코드는 위와 같이 표현될 수 있으며 명시적inline다음 중 하나:

static inline int addTwo(int *x)
{
  __add_two_superquickly(x);
}

에서는, 「」, 「」.__add_two_superquickly()함수는 허구의 본질이며, 기본적으로 전체 함수가 하나의 명령으로 컴파일되기를 원하기 때문에, 우리는 정말로 그 함수가 삽입되기를 바랍니다.그래도 위는 매크로를 사용하는 것보다 깨끗합니다.

내재를 직접 사용하는 것에 비해 장점은 물론 다른 추상화 레이어로 감싸서 특정 내재가 없는 컴파일러에 코드를 구축할 수 있다는 것입니다.또한 사용되는 컴파일러에 따라 다른 구현을 제공하고 적절한 실장을 선택함으로써 코드를 구축할 수 있습니다.

는 Yeezy Foom RNNRAs의 "Yezy Foom RNNRAs"와 static.c파일 자체입니다.는 이, 이, this, , 이, 이, 이, diffe, diffe, diffe, this, this, this, this, this, this, this, this, this, this, this, this, this, diffe, diffe,.c ★★★★★★★★★★★★★★★★★」.h된 컴파일 파일 이름)만 있습니다..c에서 지정된 임의의 파일 및 모든 파일의 내용이 표시됩니다.#include 이름).h가 프리프로세서에 의해 인식되는 대로 스트림에 삽입됩니다.

가 C라는 이름의 .c은 파일 안에 ..h단지 관례일 뿐이다.을 사용법에 은 「 」에 한정되어 있습니다..h파일은 선언이므로 일반적으로 단일 프로그램에서 동일한 기호를 두 번 이상 정의하지 않습니다.

「 」는 다음과 같습니다.static키워드를 지정하면 심볼이 모듈에 비공개되므로 문제를 일으킬 수 있는 다중 정의 충돌이 발생하지 않습니다.그런 의미에서 그렇게 하는 것이 안전합니다.함수가 이 없는 , 는 에 한 모든 해야 합니다.#include코드 세그먼트에서 메모리를 낭비하는 헤더 파일입니다.

일반적으로 이용 가능한 공개 헤더에서 이 작업을 수행할 수 있는 사용 사례가 무엇인지 확신할 수 없습니다.

경우,.h됩니다..c제가 ..h전혀 공개 헤더가 아니라는 것을 강조하기 위해서입니다.들어 는 를 통해 을 쓸 수.#include 잘 수 있습니다.static, 에 따라서는 「」도 있습니다.static접근자 또는 기타 관련 유틸리티 기능의 정의.

포함된 모든 cpp 파일 내에 동일한 이름을 가진 별도의 정적 함수를 효과적으로 생성합니다.글로벌 변수에도 동일하게 적용됩니다.

(단순히 선언하는 것이 아니라) 헤더 파일에 함수를 정의하면 각 변환 유닛(기본적으로 이 헤더를 포함하는 각 cpp 파일)에 함수 복사본이 생성됩니다.

이로 인해 실행 파일의 크기가 커질 수 있지만, 함수가 작으면 무시할 수 있습니다.장점은 대부분의 컴파일러가 함수를 인라인화할 수 있기 때문에 코드 성능이 향상될 수 있다는 것입니다.

하지만 어떤 대답에도 언급되지 않은 이 작업을 수행하는 데는 큰 차이가 있을 수 있습니다.함수가 다음과 같은 정적 로컬 변수를 사용하는 경우:

static int counter()
{
    static int ctr = 0;
    return ctr++;
}

대신:

//header
int counter();

//source
int counter()
{
    static int ctr = 0;
    return ctr++;
}

이 헤더를 포함한 각 소스 파일에는 자체 카운터가 있습니다.이 함수가 헤더 내부에서 선언되어 소스 파일에 정의되어 있는 경우, 카운터는 프로그램 전체에서 공유됩니다.

따라서 성능 및 코드 크기만 다를 것이라고 말하는 것은 잘못된 것입니다.

소스 파일 또는 헤더 파일에서의 정의에는 시멘틱한 차이가 없습니다.기본적으로 static 키워드를 사용하면 둘 다 플레인C에서 같은 의미로 스코프를 제한합니다.

그러나 헤더 파일에 이것을 쓰는 것은 문제가 있습니다.이것은, 소스 파일에 헤더를 포함할 때마다, 헤더 파일에 정의되어 있는 통상의 함수와 거의 같은 실장의 함수의 카피가 생기기 때문입니다.헤더에 정의를 추가하면 스태틱함수의 목적을 달성할 수 없습니다.

따라서 구현은 헤더가 아닌 소스 파일에만 하는 것이 좋습니다.

일부 "헤더 전용" 라이브러리에서 작은 인라인 함수를 사용할 수 있습니다.이 경우 항상 함수의 복사본을 만들고 싶기 때문에 이는 나쁘지 않은 패턴입니다.단, 이를 통해 단일 헤더파일에 별도의 인터페이스와 구현 부품을 삽입할 수 있습니다.

// header.h

// interface part (for user?!)
static inline float av(float a, float b);

// implementation part (for developer)
static inline float av(float a, float b)
{
    return (a+b)/2.f;
}

GLK 프레임워크의 Apple 벡터 연산 라이브러리는 이러한 구성(예: GLKMatrix4.h)을 사용한다.

언급URL : https://stackoverflow.com/questions/780730/c-c-static-function-in-header-file-what-does-it-mean

반응형