2011-08-04 2 views
0

나는 인터넷에서 const + extern을 찾았지만 실제로는 내 질문에 대한 좋은 대답이 아닌 것으로 보인다.extern과 const의 조합을 사용하는 변수에 대한 질문

const은 내부 연결을 의미하지만 컴파일 단위간에 const 변수를 공유하려는 경우에만 사용합니다. extern이 최선의 선택입니까?

공통 솔루션은 다음과 같습니다

// Say, I want to use this MAX in the same header file. 
// g.h 
extern const int MAX; 
class AClass 
{ 
public: 
    AClass(): i(MAX){} 
private: 
    int i; 
}; 

컴파일러 같은 불평 할 것이다 : "오류 C2057가 : 예상 상수 표현을"

//g.h 
extern const int MAX; 

// g.c 
extern const int MAX = 3; 

그러나,이 솔루션은 다음과 같은 단점이있다.

해결 방법은 있습니까?

// g.h 
enum { MAX = 3; } 

// g.c 

#include "g.h" 
static char buf[MAX]; 

당신은 MAX의 주소를 취할 수 없습니다 만, 결국 당신이 제로에이 얻을 :

+0

IIRC VS 당신이 헤더 다음'CONST INT 최대의'통근 CONST의 INT의 최대 = 3' 수행 할 수 있습니다,'소스에. 적어도 정적 멤버 변수에 대해서는 작동합니다. BTW는 소스 파일에서 extern 키워드를 정의하려고하므로 extern 키워드를 제거하십시오. – RedX

+0

여러 정의가 발생하지 않습니까? –

+0

@DaiHaoci : 왜 외부 연결을 원하나요? 어떤 장점이 있다고 생각하십니까? – ildjarn

답변

3

는 컴파일 타임에 할 수있다, 즉 그것은 외부 링크를 가질 수 없습니다.

그러나 헤더 파일에 상수를 선언하고 누구에게나 상수를 사용할 수있게 할 수 있습니다. 여전히 외부 링키지와 똑같은 효과는 없습니다.

// a.h 
const int MAX = 3; 

// a.cpp 
#include "a.h" 
int b[a]; 
+2

컴파일 단위에서'b [a]'를 공유하고 싶습니다. –

3

상수 정수에 대한 쉬운 해결책은 열거 형을 사용하는 것입니다 메모리 비용.

+0

헤더 파일에'buf'를 정의하고 싶습니다. –

+0

@DaiHaoci :이 솔루션으로 정확히 할 수 있습니다. – ildjarn

+0

당신 말이 맞아요.하지만 제 질문은 컴파일 단위간에 const 변수를 공유하는 것과 같습니다. –

0

#define을 사용하지 않는 이유는 무엇입니까? 당신이 (VLA를 사용하지 않고, 즉 크기 그것으로 배열) 컴파일 시간에 상수를 사용할 수 있도록하려면

#define MAX 3 
2
extern const int MAX; 
int i[MAX]; 

는 할 수 없습니다. 당신은 다음과 같이 할 수 있습니다

const int MAX = ReadAnIntegerFromTheConsole(); 

완벽하게 유효하고 합법적이지만 whoopsies는 상수 표현이 아닙니다.

+0

하지만 extern과 const를 결합하는 것이 허용되는 이유는 무엇입니까? –

+0

@DaiHaoci : 전자는 연결 지정자이고, 후자는 유형 데코레이터입니다. 'const'는 내부 연결 ('static')을 의미합니다 _by default_; 그렇다고해서 그 기본 설정을 무시할 수는 없습니다. – ildjarn

+0

@ildjarn : 기본값을 덮어 쓴 후에 문자가 변경되었습니다. 'extern'이 아닌 경우, int i [MAX]를 선언 할 수 있습니다. –

2

const 혼자 const는 개체가 돌연변이 수 없다고, static 내부 연결을 나타냅니다이 정확하지 않은 내부 연결을

을 의미한다. 변수를 다음과 같이 선언하십시오.

extern static int foo; 

컴파일러는 충돌하는 링키지에 대해 불평 할 것입니다. 번역 단위간에 const을 공유하면 귀하가 제안한 바를 정확히 수행 할 수 있습니다.소스 파일 여기

const int MAX = 10; // note you can omit the extern here 
+0

'MAX '를'const'로 선언/정의했다면 답이 더 적절할 것입니다. ; -] – ildjarn

+0

@ildjarn 좋은 지적 : – Praetorian

1

에서 헤더

extern const int MAX; 

에서

이 문제를 해결할 수있는 작업 예이다. 요약하면 헤더 파일에서 배열 크기를 상수로 정의하십시오. 다른 헤더 파일에서 배열을 extern으로 선언하십시오. 아래 예제에서 배열에 대한 포함 파일을 사용하지 않고 배열을 extern으로 참조합니다.

array_size.hpp

const unsigned int MAX_ARRAY_SIZE = 16; 

array.cpp

#include "array_size.hpp" 
int array[MAX_ARRAY_SIZE]; 

MAIN.CPP

#include "array_size.hpp" 

// Reference the array from array.cpp 
extern int array[MAX_ARRAY_SIZE]; 

int main(void) 
{ 
    array[1] = 7; 
    return 0; 
} 

* 표시 array_size.hpp * 파일은 크기를 정의하며 식별자는 헤더를 포함하여 다른 번역 단위에서 사용될 수 있습니다.

내가 사용 Cygwin에서 컴파일 :

g++ -I. -o array.exe main.cpp array.cpp