programing

C 프로그래밍에서 정적 구조를 사용하는 이유와 시기

prostudy 2022. 6. 11. 11:47
반응형

C 프로그래밍에서 정적 구조를 사용하는 이유와 시기

수정을 요청한 드라이버 코드에서 정적 구조 선언을 자주 볼 수 있습니다.

는 왜 보려고 했다.structs정적인 것으로 선언되고 그 동기가 밝혀집니다.

여러분 중 누가 제가 이것을 이해하도록 도와주실 수 있나요?

구조 변수

다음과 같은 구조 변수의 경우static struct S s;이는 에서 폭넓게 논의되어 왔습니다.C에서 'static'이란 어떤 의미입니까?

구조 정의: 효과 없음:

static struct S { int i; int j; };

는, 다음과 같습니다.

struct S { int i; int j; };

절대 사용하지 마세요.GCC 4.8에서는 경고를 보냅니다.

구조 정의에는 저장소가 없으며 변수 및 함수와 같은 객체 파일에 기호를 생성하지 않기 때문입니다.컴파일 및 디컴파일만 시도하면 됩니다.

struct S { int i; int j; };
int i;

포함:

gcc -c main.c
nm main.o

'없을 것 같다'라는 게 없어요.S '심볼'이 요.i★★★★★★ 。

컴파일러는 단순히 정의를 사용하여 컴파일 시 필드의 오프셋을 계산합니다.

이것은 보통 헤더에 포함되는 구조 정의입니다.여러 번 포함되더라도 여러 개의 개별 데이터는 생성되지 않습니다.

입니다.enum.

C++ 구조 정의: C++11에서 사용되지 않음

C++11 N3337 표준 초안 부록 C 7.1.1:

변경 사항: C ++에서는 static 또는 extern 지정자를 개체 또는 함수의 이름에만 적용할 수 있습니다. 이러한 지정자를 형식 선언과 함께 사용하는 것은 C ++에서 불법입니다.C에서 이러한 지정자는 유형 선언에서 사용되는 경우 무시됩니다.

참고 항목: https://stackoverflow.com/a/31201984/895245

staticC의 키워드는 적용되는 컨텍스트에 따라 여러 가지 효과가 있습니다.

  • 함수 내에서 선언된 변수에 적용되면 해당 변수의 값은 함수 호출 간에 유지됩니다.
  • 함수 외부에 선언된 변수 또는 함수에 적용될 경우 해당 변수 또는 함수의 가시성은 파일 자체에서 선언된 "정보 단위"로 제한됩니다.변수의 경우 이는 일종의 "로컬하게 볼 수 있는 전역 변수"로 요약됩니다.

두 사용 모두 드라이버와 같은 비교적 낮은 수준의 코드에서는 매우 일반적입니다.

전자와 후자를 변수에 적용하면 함수가 콜 간에 상태 개념을 유지할 수 있으므로 매우 편리합니다.다만, 복수의 스레드 또는 복수의 발신자에 의해서 동시에 사용되고 있는 임의의 컨텍스트에서 코드가 사용되고 있는 경우는, 모든 종류의 곤란한 문제가 발생할 가능성이 있습니다.코드가 1명의 「사용자」에 의해서 차례로 엄밀하게 호출되는 것을 보증할 수 없는 경우는, 콜 마다 발신자에 의해서 유지되고 있는 일종의 「콘텍스트」구조를 전달할 수 있습니다.

후자를 함수에 적용하면 프로그래머는 함수를 모듈 외부에서 보이지 않게 만들 수 있습니다.또한 컴파일러가 변수/함수를 모듈 외부에서 사용할 수 있도록 할 필요가 없다는 것을 알기 때문에 특정 아키텍처용 컴파일러에서는 다소 더 빠를 수 있습니다.예를 들어 함수를 인라인화할 수 있습니다.

다른 모든 답변이 놓치고 있는 것 같습니다.static는 객체의 저장 기간과 자동(로컬 변수) 및 할당(malloc 및 friends에 의해 반환된 메모리)도 지정합니다.

static storage duration을 가진 객체는 initializer가 지정된 경우 main()이 시작되기 전에 초기화됩니다.initializer가 지정되어 있지 않은 경우 0이 할당된 것처럼 초기화됩니다(구조체 및 배열의 경우 각 멤버에 대해 반복적으로 적용됩니다).

두 번째 속성staticID의 세트는 링크입니다.이것은 링크 시에 사용되는 개념으로, 같은 오브젝트를 참조하는 식별자를 링커에 통지합니다.static키워드를 지정하면 식별자에 내부 링크가 생깁니다.즉, 다른 변환 유닛에서 같은 이름의 식별자를 참조할 수 없습니다.

그리고 내가 이전에 읽은 모든 엉성한 답변에 대해 현학적으로 말하자면, 정적 변수는 선언된 파일 내의 모든 곳에서 참조될 수 없다.이 범위는 선언부터 소스 파일 끝까지(함수 정의 사이에 있을 수 있음) 또는 심지어 더 작은 블록까지입니다.

static의 수식어struct는 구조의 가시 범위를 현재 변환 유닛(파일)으로 제한합니다.

메모: 이 답변은 (다른 응답자가 지적한 바와 같이) 선언이 함수 내에 있지 않다고 가정합니다.

변수를 존재로 선언하는 경우static는, 그 변환 유닛(글로벌하게 선언되어 있는 경우)에만 표시되거나 콜간에 그 값이 유지됩니다(함수내에 선언되어 있는 경우).

당신의 경우는 첫 번째 케이스라고 생각합니다.이 경우 프로그래머는 다른 파일에서 구조를 볼 수 있도록 하고 싶지 않았을 것입니다.

언급URL : https://stackoverflow.com/questions/7259830/why-and-when-to-use-static-structures-in-c-programming

반응형