본문 바로가기
Programming/C & C++

자주 접하는 오류문들

by leanu 2023. 5. 9.

error: ISO C++ forbids declaration of ‘자료형’ with no type
-------------------------------------------------------------------------------------------
원인 : 자료형이 제대로 선언되지 않은채 사용되었다.
해결 :
          1. 이 자료형이 선언된 헤더파일의 경로 및 파일이름이 올바른지 확인한다.
          2. namespace안에 구현된 경우일 수도 있으니 namespace를 사용했는지 확인한다.



error: 'NullLock' was not declared in this scope
-------------------------------------------------------------------------------------------
원인 : 자료형이 제대로 선언되지 않았다.
해결 :
          1. 만약 include한 파일이 include path 중에 2군대 이상 존재한다면, 첫번째 path 안에
             있는
파일이 include 된다. 해결하려면 컴파일 옵션에서 include path의 순서를 바꾸
             거나,
using namespaceObject::Something 처럼 사용하고자 하는것만 골라서 쓰면
             된다. 되도록이면 using namespace namespaceObject 처럼 모든 것을 포함시키지 말고,
             using namespaceObject::something 처럼 사용하는것 하나하나씩만 끌어다 쓰도록
             하자.


    (예) lock.h 라는 파일이 /test/lock.h 에 있고 /test/include/lock.h에 있다고 가정하자.
         컴파일 옵션은
         gcc -I/test/lock.h -I/test/include/lock.h -c -o something.o something.cpp
         일때
lock.h 는 처음 include 경로로 잡았던 /test/lock 의 lock.h를 읽어오게 된다.

          2. name space 를 사용했는지 확인한다.

error: undefined reference to 'xxx'
-------------------------------------------------------------------------------------------
원인 : 링킹 과정중 라이브러리 파일이 잘 연결되지 못했다.
해결 :
               1. 라이브러리 명과 라이브러리 경로를 확인한다.
               2. 그래도 안되면 라이브러리 순서를 바꿔본다. (다른 라이브러리에 의존적이지 않은 것을
                    뒤에 오게한다. 반드시 뒤에 기술된 라이브러리는 앞에 기술된 라이브러리를 참조하면
                   안된다)
               3. 1,2번이 안되는 예가 있다. 라이브러리끼리 서로 참조하는 경우에는 순서를 바꿔본들
                   에러는 변함없이 난다. 그런경우 다음과 같이 한다. Xlinker 는 linker 에게 옵션을 넘긴다
                   는 뜻이고 start ~ end-group 은 링크를 하나로 그루핑 하는 function 이다.
                  (예) lib1.a 와 lib2.a 가 서로 참조하는 경우 아래와 같은 옵션을 통해서 해결할 수 있다.
                         gcc -o exefile -Xlinker --start-group lib1.a lib2.a -Xlinker --end-group

 
 
error: passing 'const XXXXX' as 'this' argument of 'xxxxxx' discard qualifiers
-------------------------------------------------------------------------------------------
원인 : const로 선언한  class 에서 const 를 보장할 수 없는 함수가 호출되었다. 즉, 어떤 클래스를 
const 로 사용하기로 했는데 그 클래스의 맴버함수중에 const 속성을 보장할수 없는 것을 호출한 
경우이다.

(예) int attachFirstStringAfterSecondString( const string& First, const string& Second )
     {
              Second.attach( First );    // This line Occurs error
     }

해결 : 우선 호출한 함수에 대해 생각해봐야 한다. 이것이 const속성을 보장해야 하는 함수인지 아닌지를 말이다. 만약 이것이 상수성을 보장해야 한다면 첫번째 방법을 써야 하고, 그렇지 않은경우 클래스를 이용할때 const로 이용하지 말아야 한다. 이것은 class design 시 신중하지 않으면 나중에 골치아픈 문제를 야기시킬수 있으므로 design step에서 신경쓰도록 하자.

          1. 함수에 대해서 const 를 보장하게 만든다. (예) int displayValue(void) const;
            - 안에서 멤버변수를 변경하는 부분을 없앤다.
            - 만약 부득이하게 멤버 변수를 변경해야 하는경우 그 맴버 변수를 mutable로 선언한다.
               (예) mutable int length_;
 
           2. class 를 const 형태로 이용하지 않는다. 하지만 이 방법은 추천하지 않는다. 만약 변경될
               필요가 없는 인자 클래스를 const를 벗긴채로 사용할경우, 변경하더라도 아무런 에러를 발생
               시키지 않기 때문에 좋은 코딩스타일이라고 볼 수 없다. 신중히 생각하고 const 를 벗기도록
               하자.
 
error: expected unqualified-id ...
-------------------------------------------------------------------------------------------
원인 : 어딘가에 동일한 이름의 MACRO 가 쓰이고 있다.
해결 : 빌드하는 모든 소스를 검사하여 MACRO 이름을 바꾸거나 겹치지 않게 조치를 취한다.
 

댓글