C에서 extern 키워드를 올바르게 사용하는 방법
가 궁금한 것은 어떤 것입니다.extern
키워드를 지정합니다.
나는 이것이 언제 실제로 사용되어야 하는지 모르겠다.프로그램을 작성하기 때문에 제가 사용하는 기능은 모두 첨부한 헤더 파일을 통해 이용할 수 있습니다. 왜 이 요?extern
머리글 파일에 노출되지 않은 것에 접근할 수 있게 해줬나요?
하면 좋을지 수 것 같아요extern
이치노렇면 츠
should고... also? ★★★★★★★★★★★★★★★★?extern
헤더 파일에 키워드가 없는 디폴트 선언인 경우?
extern
링크를 변경합니다.키워드를 지정하면 함수/변수는 다른 장소에서 사용할 수 있는 것으로 간주되며 해결은 링커에 지연됩니다.
차이가 있어요.extern
함수와 변수에 대해 설명합니다.
변수의 경우 변수 자체를 인스턴스화하지 않습니다. 즉, 메모리를 할당하지 않습니다.이 일은 다른 곳에서 해야 한다.따라서 변수를 다른 곳에서 가져오려는 경우 중요합니다.
함수의 경우, 이것은 링크가 외부라는 것만 컴파일러에 알립니다.이것은 디폴트이기 때문에(키워드를 사용합니다).static
외부 링크를 사용하여 함수가 구속되지 않음을 나타내기 위해)를 명시적으로 사용할 필요가 없습니다.
extern
는 컴파일러에게 이 데이터가 어딘가에 정의되어 있으며 링커와 연결되어 있음을 알려줍니다.
몇 실제 를 들 수 .extern
.
예 1 - 함정 표시:
stdio.h
:
int errno;
myCFile1.c
:
#include <stdio.h>
// Code using errno...
myCFile2.c
:
#include <stdio.h>
// Code using errno...
ifmyCFile1.o
★★★★★★★★★★★★★★★★★」myCFile2.o
는 링크되어 각에는 개별 .errno
errno
모든 링크된 파일에서 사용할 수 있어야 합니다.
예 2 - 수정.
stdio.h
:
extern int errno;
stdio.c
:
int errno;
myCFile1.c
:
#include <stdio.h>
// Code using errno...
myCFile2.c
:
#include <stdio.h>
// Code using errno...
, 그럼 둘 다 하면myCFile1.o
★★★★★★★★★★★★★★★★★」MyCFile2.o
둘 다 같은 링커를 .이랬다errno
구현 문제를 extern
.
은 이미 이 되어 있습니다.extern
키워드는 함수의 경우 용장합니다.
컴파일 유닛 간에 공유되는 변수에 대해서는 extern 키워드를 지정하여 헤더 파일로 선언한 후 extern 키워드를 지정하지 않고 단일 소스 파일로 정의해야 합니다.베스트 프랙티스를 위해 단일 소스 파일은 헤더 파일의 이름을 공유하는 파일이어야 합니다.
몇 년이 지난 후, 나는 이 질문을 발견한다.모든 답변과 댓글을 읽고 몇 가지 세부사항을 명확히 할 수 있을 것 같아서...이것은 구글 검색을 통해 이곳에 도착하는 사람들에게 유용할 수 있다.
질문은 특히 다음 사용법에 관한 것입니다.extern
이 기능을 사용하기 때문에 이 기능의 사용은 무시합니다.extern
글로벌 변수를 사용합니다.
3가지 기능 프로토타입을 정의하겠습니다.
// --------------------------------------
// Filename: "my_project.H"
extern int function_1(void);
static int function_2(void);
int function_3(void);
헤더 파일은 다음과 같이 메인소스 코드에서 사용할 수 있습니다.
// --------------------------------------
// Filename: "my_project.C"
#include "my_project.H"
void main(void) {
int v1 = function_1();
int v2 = function_2();
int v3 = function_3();
}
int function_2(void) return 1234;
컴파일 및 링크하기 위해서는 다음 명령어를 정의해야 합니다.function_2
같은 소스코드 파일에 저장되어 있습니다.다른 두 함수는 다른 소스 코드로 정의될 수 있습니다.*.C
또는 임의의 바이너리 파일에 배치할 수 있습니다.*.OBJ
,*.LIB
,*.DLL
소스 코드가 없을 수 있습니다.
헤더를 다시 포함합시다.my_project.H
다른 방법으로*.C
파일을 작성하면 차이를 더 잘 알 수 있습니다.같은 프로젝트에서 다음 파일을 추가합니다.
// --------------------------------------
// Filename: "my_big_project_splitted.C"
#include "my_project.H"
void old_main_test(void){
int v1 = function_1();
int v2 = function_2();
int v3 = function_3();
}
int function_2(void) return 5678;
int function_1(void) return 12;
int function_3(void) return 34;
주의해야 할 중요한 기능:
함수가 다음과 같이 정의되어 있는 경우
static
헤더 파일에서 컴파일러/링커는 해당 인크루드 파일을 사용하는 각 모듈에서 해당 이름을 가진 함수의 인스턴스를 찾아야 합니다.C 라이브러리의 일부인 기능은 시제품을 다음과 같이 재정의하여 한 모듈에서만 교체할 수 있습니다.
static
해당 모듈에서만 가능합니다.예를 들어, 에의 콜을 치환합니다.malloc
그리고.free
메모리 누전 검출 기능을 추가합니다.지정자
extern
기능에는 그다지 필요하지 않습니다.언제static
찾을 수 없습니다. 함수는 항상 다음과 같이 가정됩니다.extern
.하지만,
extern
는 변수의 기본값이 아닙니다.일반적으로 여러 모듈에서 볼 수 있는 변수를 정의하는 헤더파일을 사용해야 합니다.extern
유일한 예외는 헤더파일을 1개의 모듈에서만 포함할 수 있는 경우입니다.많은 프로젝트 매니저는 이러한 변수를 헤더 파일 내부가 아닌 모듈의 선두에 배치해야 합니다.비디오 게임 에뮬레이터 "Mame"과 같은 일부 대형 프로젝트에서는 이러한 변수를 사용하는 첫 번째 기능 위에만 표시하도록 요구합니다.
프로그램 내의 각 파일이 먼저 오브젝트 파일로 컴파일되고 오브젝트 파일이 서로 링크되어 있는 경우, 필요한 것은extern
컴파일러에게 이 함수는 존재하지만 코드는 다른 곳에 있습니다.당황하지 마세요.
주식회사,extern
시제품이 다른 곳에서 정의된 기능을 선언하기 때문에 기능 시제품에 대해 암시됩니다.즉, 함수 프로토타입에는 기본적으로 외부 링크가 있습니다.extern
는 정상이지만 용장성이 있습니다.
(정적 링크가 필요한 경우 함수는 다음과 같이 선언해야 합니다.static
일반적으로 둘 다 같은 .c 파일에 있어야 합니다.)
다른 소스 파일에 실제로 정의된 함수는 헤더에만 선언해야 합니다.이 경우 헤더에 프로토타입을 선언할 때 extern을 사용해야 합니다.
대부분의 경우 기능은 다음 중 하나입니다(베스트 프랙티스에 가깝습니다.
- static(.c 파일 외부에 표시되지 않는 일반 함수)
- 스태틱 인라인(.c 또는 .h 파일에서 인라인)
- extern(다음 종류의 헤더에 대한 설명(아래 참조))
- [키워드 없음] (외부 선언을 사용하여 액세스 할 수 있는 일반 함수)
내가 찾아낸 아주 좋은 기사는extern
키워드와 http://www.geeksforgeeks.org/understanding-extern-keyword-in-c/ 의 예를 나타냅니다.
사용방법에 동의하지 않지만extern
함수 선언이 중복됩니다.이것은 컴파일러 설정입니다.그래서 추천하는 것은extern
필요한 경우 함수 선언에 입력합니다.
해당 함수를 다른 dll 또는 lib에 정의하여 컴파일러가 링커에 접근하여 검색하도록 하는 경우.일반적인 경우는 OS API에서 함수를 호출하는 경우입니다.
헤더 파일의 모든 함수 및 변수 선언은 다음과 같아야 합니다.extern
.
이 규칙의 예외는 헤더에 정의되어 있는 인라인 함수 및 변수입니다.이러한 함수는 헤더에 정의되어 있지만 변환 유닛(헤더가 포함되는 소스 파일)에 대해 로컬이어야 합니다.이러한 함수는 다음과 같습니다.static
.
소스 파일에서는extern
파일에 정의된 함수 및 변수에는 사용할 수 없습니다.로컬 정의 접두사만 지정하면 됩니다.static
공유 정의에 대해서는 아무것도 하지 않습니다.기본적으로 외부 기호입니다.
사용하는 유일한 이유extern
소스 파일에 있는 모든 것은 다른 소스 파일에 정의되어 있고 헤더 파일이 제공되지 않은 함수 및 변수를 선언하는 것입니다.
기능 프로토타입 선언extern
사실 불필요합니다.일부에서는 공간만 낭비하고 함수 선언은 이미 회선 한계를 넘나드는 경향이 있기 때문에 이를 싫어합니다.다른 사람들은 이런 식으로 함수와 변수를 동일하게 취급할 수 있기 때문에 좋아합니다.
언급URL : https://stackoverflow.com/questions/496448/how-to-correctly-use-the-extern-keyword-in-c
'programing' 카테고리의 다른 글
요청이 있는 python에서 대용량 파일 다운로드 (0) | 2022.09.25 |
---|---|
Ruby on Rails 3 소켓 '/tmp/mysql'을 통해 로컬 MySQL 서버에 연결할 수 없습니다.OSX에서 '삭 (0) | 2022.09.25 |
MYSQL을 사용하여 난수 생성 (0) | 2022.09.25 |
SSR에서 Vuex와 함께 vue-instantsearch를 사용하는 방법 (0) | 2022.09.25 |
HAVING 절의 다중 집계 함수 (0) | 2022.09.25 |