작성
·
223
1
//test.cpp
#include <iostream>
using namespace std;
static int g_a = 1;
// forawrad declaration
void doSomething();
// == extern void doSomething();
extern int a;
int main()
{
doSomething();
cout << a << endl;
return 0;
}
// test2.cpp
#include <iostream>
int a = 10;
void doSomething()
{
using namespace std;
cout << "Hello" << endl;
}
다음 코드 중 test.cpp 파일에서
void doSomething();
같은 경우는
extern void doSomething();
이렇게 extern 을 붙이든 말든 똑같이 잘 작동합니다.
하지만
extern int a;
의 경우에는
extern 없이
int a;
이렇게만 하면 linker error가 나옵니다.
이유가 궁금해요.
다음은 해당 linker error 입니다.
현재 맥북 프로 사용 중이며 arm64입니다.
VS code로 std=c++17 컴파일 했습니다.
duplicate symbol '_a' in:
/var/folders/js/x_hy51p16_x1jsv90sbbh7mw0000gn/T/test-06a7e1.o
/var/folders/js/x_hy51p16_x1jsv90sbbh7mw0000gn/T/test2-9147ce.o
ld: 1 duplicate symbol for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
답변 1
1
안녕하세요, 답변 도우미 Soobak 입니다.
함수의 프로토타입을 선언할 때, void doSomething();
과 extern void doSomething();
은 기능적으로 동일합니다. 전자의 경우 앞에 extern
키워드가 생략된 것으로 보시면 됩니다.
하지만 변수의 경우, extern
키워드 없이 int a;
와 같이 선언하면, 해당 소스 파일에서 그 변수의 정의를 생성하게 됩니다.
따라서, 두 개의 소스 파일에서 동일한 이름을 가진 전역 변수를 정의하면, 링커는 이를 중복된 심볼로 간주하고 오류를 반환합니다.
따라서, extern int a;
와 같이 변수를 선언하여, 해당 변수의 정의가 다른 곳에 있음을 나타내주는 것입니다.