글에 대한 공지 만약 검색 엔진에 컴파일 에러 메세지를 입력하여 이 글을 읽게 되었다면, 에러 메세지와, 에러가 난 코드를 답글로 달아 주세요. 같이 풀어 봅시다.
코드의 아주 일부만 바꾸었을 뿐인데 갑자기 없던 에러가 몇 십 개, 몇 백개 날 때가 있다. 그 때는 주로 pre-compiler에 의한 문제로, 코드 상에 잘못 주석처리된 부분이 있다거나, 코드 중간에 이상한 문자가 뜬금없이 들어가 있을 때이다. Visual Studio의 경우, F4를 눌렀을 때 찾아가는 위치가 실제 에러의 원인이 되는 곳과는 전혀 다른 곳이라는 점.
예를 들면 이런 경우다.
총 20개의 에러가 '갑자기' 생겼다. testVIew.cpp 의 18 번째 줄은
cpp 파일의 제일 윗단에 있는, THIS_FILE 키워드를 설정하는 부분으로 난 저 곳을 고친 기억이 전혀 없다. 그리고 저 구문 자체는 전혀 문제가 없어 보인다. 물론 위와 같은 경우 release mode로 하면 다른 에러가 나온다. 위의 #ifdef _DEBUG에 걸리지 않아서. 이럴 때는 저 위치의 윗쪽에 있는 구문을 다시 살펴 보아야 한다.
문제가 될만한 부분은 내가 만든 model.h 라는 파일 부분. 다시 그 파일 안으로 들어가서 살펴 보면,
이렇게 끝나고 있는데, 주석 처리가 S = 0; 인 부분에 되었어야 하는데, if의 닫는 } 에 되어 있다. 이것이 문제였다. 즉, } 가 짝이 안맞는 상태로 pre-compiler가 compiler로 넘겨 버린 것이다. 왜 이런 경우 pre-compiler가 못 잡아내는지 알 수 없지만, 하여튼 그 하나의 짝이 안 맞아서 그 뒤에 include 된 부분 등에서 구문이 완전히 엉망이 되어 수십개의 에러가 난 것이었다.
코드의 아주 일부만 바꾸었을 뿐인데 갑자기 없던 에러가 몇 십 개, 몇 백개 날 때가 있다. 그 때는 주로 pre-compiler에 의한 문제로, 코드 상에 잘못 주석처리된 부분이 있다거나, 코드 중간에 이상한 문자가 뜬금없이 들어가 있을 때이다. Visual Studio의 경우, F4를 눌렀을 때 찾아가는 위치가 실제 에러의 원인이 되는 곳과는 전혀 다른 곳이라는 점.
예를 들면 이런 경우다.
--------------------Configuration: test - Win32 Debug--------------------
Compiling...
testView.cpp
F:\Desktop\논문\TNF-activation, time is matter\src\test\testView.cpp(18) : error C2258: illegal pure syntax, must be '= 0'
F:\Desktop \논문\TNF-activation, time is matter\src\test\testView.cpp(18) : error C2252: 'THIS_FILE' : pure specifier can only be specified for functions
Compiling...
testView.cpp
F:\Desktop\논문\TNF-activation, time is matter\src\test\testView.cpp(18) : error C2258: illegal pure syntax, must be '= 0'
F:\Desktop \논문\TNF-activation, time is matter\src\test\testView.cpp(18) : error C2252: 'THIS_FILE' : pure specifier can only be specified for functions
총 20개의 에러가 '갑자기' 생겼다. testVIew.cpp 의 18 번째 줄은
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__; // < -- 여기서 에러가 났다고 한다.
#endif
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__; // < -- 여기서 에러가 났다고 한다.
#endif
cpp 파일의 제일 윗단에 있는, THIS_FILE 키워드를 설정하는 부분으로 난 저 곳을 고친 기억이 전혀 없다. 그리고 저 구문 자체는 전혀 문제가 없어 보인다. 물론 위와 같은 경우 release mode로 하면 다른 에러가 나온다. 위의 #ifdef _DEBUG에 걸리지 않아서. 이럴 때는 저 위치의 윗쪽에 있는 구문을 다시 살펴 보아야 한다.
#include "stdafx.h"
#include "test.h"
#include "testDoc.h"
#include "testView.h"
#include "model.h"
#include <algorithm> // 이 중 문제되는 부분이 있을 것이다.
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__; // <-- 에러가 났다고 하는 부분
#endif
#include "test.h"
#include "testDoc.h"
#include "testView.h"
#include "model.h"
#include <algorithm> // 이 중 문제되는 부분이 있을 것이다.
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__; // <-- 에러가 났다고 하는 부분
#endif
문제가 될만한 부분은 내가 만든 model.h 라는 파일 부분. 다시 그 파일 안으로 들어가서 살펴 보면,
if(time > 50){
S = 0;
// }
return true;
S = 0;
// }
return true;
이렇게 끝나고 있는데, 주석 처리가 S = 0; 인 부분에 되었어야 하는데, if의 닫는 } 에 되어 있다. 이것이 문제였다. 즉, } 가 짝이 안맞는 상태로 pre-compiler가 compiler로 넘겨 버린 것이다. 왜 이런 경우 pre-compiler가 못 잡아내는지 알 수 없지만, 하여튼 그 하나의 짝이 안 맞아서 그 뒤에 include 된 부분 등에서 구문이 완전히 엉망이 되어 수십개의 에러가 난 것이었다.
'컴퓨터 > 디버깅' 카테고리의 다른 글
Debug Assertion Failed! (0) | 2010.04.19 |
---|---|
Iteration over non-sequence (0) | 2010.04.16 |
no match for ‘operator<’ in ‘__x < __y’ (0) | 2010.04.15 |
l-value specifies const object (0) | 2010.04.13 |
명확하지 않게 다가오는 컴파일 에러 메세지들과 그 뜻 (0) | 2009.12.30 |