C의 공유 전역 변수


82

C에서 공유되는 전역 변수를 어떻게 만들 수 있습니까? 헤더 파일에 넣으면 링커는 변수가 이미 정의되어 있다고 불평합니다. 내 C 파일 중 하나에서 변수를 선언하고 extern사용하려는 다른 모든 C 파일의 맨 위에 s 를 수동으로 넣는 유일한 방법 입니까? 이상적이지 않은 것 같습니다.


자신의 소스 코드 내에서 공유 하시겠습니까? 하나의 헤더 파일에 extern 선언을 넣고 다른 (단일) 소스에 정의를 넣습니다. 물론 프로세스 스레드간에 공유됩니다. 데이터의 프로세스 간 공유를 위해 IPC 메커니즘 (공유 메모리, 파이프)을 사용합니다.
Hernán



답변:


63

헤더 파일에 extern. 그리고 c 파일 중 하나의 전역 범위에서 extern.


1
대신 * .c 파일의 헤더 파일에서 선언 할 수 있습니까?
Geremia

91

하나의 헤더 파일 (shared.h)에서 :

extern int this_is_global;

이 전역 기호를 사용하려는 모든 파일에 extern 선언이 포함 된 헤더를 포함합니다.

#include "shared.h"

여러 링커 정의를 방지하려면 컴파일 단위 (예 : shared.cpp)에 전역 기호 선언이 하나만 있어야합니다 .

/* shared.cpp */
#include "shared.h"
int this_is_global;

IPC 메커니즘에 대해 자세히 알아보기 위해 선호하는 참조가 있습니까?
NickO 2013

7
"글로벌 심볼에 대한 단 하나의 선언 만 ..."에 더 강조를 해주세요. 나는 전역 변수를 사용하고 싶었던 모든 c 파일에 대한 선언을 가지고 있었다 :(
AntonioCS

22

헤더 파일에서

헤더 파일

#ifndef SHAREFILE_INCLUDED
#define SHAREFILE_INCLUDED
#ifdef  MAIN_FILE
int global;
#else
extern int global;
#endif
#endif

전역에 적용 할 파일이있는 파일에서 :

#define MAIN_FILE
#include "share.h"

extern 버전이 필요한 다른 파일에서 :

#include "share.h"

아 이것은 내가 얼마 전에 가지고 있던 해결책입니다-MAIN_FILE 전 처리기 변수를 잊어 버렸습니다. 난 그래도 더 CUR 허용 대답처럼을 thinik
Claudiu

15

헤더 파일에 선언을 넣습니다.

 extern int my_global;

.c 파일 중 하나에서 전역 범위에서 정의합니다.

int my_global;

액세스하려는 모든 .c 파일 my_global에는 externin.


5

C와 C ++간에 코드를 공유하는 경우 shared.h파일에 다음을 추가해야 합니다.

#ifdef __cplusplus
extern "C" {
#endif

extern int my_global;
/* other extern declarations ... */

#ifdef __cplusplus
}
#endif

2

헤더 파일이 하나만있는 깔끔한 방법이 있으므로 유지 관리가 더 간단합니다. 전역 변수가있는 헤더에서 각 선언에 키워드 (공통 사용)를 접두사로 한 다음 하나의 소스 파일에 다음과 같이 포함하십시오.

#define common
#include "globals.h"
#undef common

및 이와 같은 다른 소스 파일

#define common extern
#include "globals.h"
#undef common

globals.h 파일의 변수를 초기화하지 않도록하십시오. 그렇지 않으면 초기화 된 변수가 extern 키워드를 사용해도 외부로 처리되지 않기 때문에 링커가 여전히 불평 할 것입니다. global.h 파일은 다음과 유사합니다.

#pragma once
common int globala;
common int globalb;
etc.

모든 유형의 선언에서 작동하는 것 같습니다. 물론 #define에 공통 키워드를 사용하지 마십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.