2016-06-02 11 views
5

이 문제는 -std=c++14 이전의 g ++에서 재현 가능합니다. 링크 오류는 아래 코드에 표시된 const 강조 표시로 인해 생성됩니다. RHS const이 제거되면 사라집니다.C++에서 포인터 배열의 constance로 인한 연결 오류 03/C++ 11

/* main.cpp */ 
const char* const arr[2] = {"Hello", "World"}; 
//   ^^^^^ 
int main() {} 

및 컴파일하는 동안

/* foo.cpp */ 
extern const char* const arr[2]; 
//     ^^^^^ 
const char* foo() { return arr[0]; } 

: g++ [-std=c++11] main.cpp foo.cpp, 그것은 다음과 부여합니다 연결 오류 :이 컴파일러의 버그 또는 언어 제한/기능

In function `foo()': undefined reference to `arr' 

인가?

쿠엔틴에 의해 발견으로
+3

'extern '을 추가하지 않으면 네임 스페이스 범위 [암시 적으로'static'] (http://stackoverflow.com/questions/33402177/const-global-variable-in-namespace)에서'const' 변수가 사용됩니다. 왜'-std = C++ 14'로 동작이 바뀌는 지 모르겠습니다. – Quentin

+0

'main.cpp'와'foo.cpp'가 모두 포함하는 헤더 파일에'extern const char * const arr [2];가 없어야합니까? – NathanOliver

+0

@Quentin 왜 OP가 pre C++ 14라고 말하는지 잘 모르겠다. g ++ 5.1.0은 어떤 모드 (C++ 14 C++ 17)에서 에러를 발생 시키지만, 여러분의 코멘트는 대답이어야한다. – Slava

답변

3

는 초안 n4296은 장 3.5 프로그램에 그것에 대해 명시하고 링크는 [basic.link] §3

A name having namespace scope (3.3.6) has internal linkage if it is the name of
(3.1) — a variable, function or function template that is explicitly declared static; or,
(3.2) — a variable of non-volatile const-qualified type that is neither explicitly declared extern nor previously declared to have external linkage;

당신을 const로 arr를 선언, 그것이 (내 강조) 암묵적으로 내부 연계가 주어졌다.

/* main.cpp */ 
extern const char* const arr[2] = {"Hello", "World"}; 

그러나 가장 좋은 방법은 효율적으로 산출 올바르게 선언을 공유 한 후 해당 파일 const char* const arr[2] = {"Hello", "World"}; 중 하나에 추가하기 위해 arr를 사용하여 모든 파일에 포함 된 헤더 extern const char* const arr[2];을 가지고 추천 할 것입니다 : 수정은 간단하다

/* main.cpp */ 
extern const char* const arr[2]; // directly or more likely through an include... 
... 
const char* const arr[2] = {"Hello", "World"};