본문으로 바로가기
728x90
반응형

오늘은 C언어의 에러에 대해 알아보겠습니다.

 

expected specifier-qualifier-list before, unknown type name

 

위의 에러를 많이 보셨을 수 있습니다.

 

에러를 해석해보면, 알수 없는 타입 이름에 대한 에러라고 합니다.

 

예제를 한번 보겠습니다.

 

----------------------------------------------------------------------------------

root@test-VirtualBox:/home/test/tmp# cat header.h
typedef struct {
        int data;
        NODE *next;
} NODE;
root@test-VirtualBox:/home/test/tmp# cat main.c
#include <stdio.h>
#include "header.h"

int main(){
        NODE node;

        return 1;
}

----------------------------------------------------------------------------------

 

위와 같은 헤더 파일과, 소스 파일이 있습니다.

 

연결리스트에서 많이 쓰이는 구조입니다.

 

헤더에서는 구조체를 정의하였고, 소스에서는 그 구조체의 자료형 변수를 선언하였습니다.

 

컴파일을 하니 에러가 발생하였습니다.

 

-gcc 4.47 버젼에서 컴파일

gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-17)

]# gcc -o main main.c
In file included from main.c:2:
header.h:4: error: expected specifier-qualifier-list before ‘NODE’

 

-gcc 9.4.0 버젼에서 컴파일
gcc (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0

gcc -o main main.c
In file included from main.c:2:
header.h:3:2: error: unknown type name ‘NODE’
    3 |  NODE *next;
      |  ^~~~

 

gcc 버젼에 따라서 에러 내용이 다르지만, 어디서 난 에런지에 대해 표시를 해줍니다.

 

이 에러의 문제가 뭐냐하면 헤더 파일에서 사용자 정의로 구조체를 정의하고, 그 구조체 안에 방금 정의 한 그 구조체 자료형으로 포인터 변수 선언을 하였습니다.

 

이런 구조체를 정의한다면, 컴파일러는 인식을 못합니다.

 

왜냐하면 구조체 안의 사용자 정의 자료형은 아직 정의가 되지 않은 상태에서 포인터 변수를 선언했기 때문입니다.

 

아래와 같이 헤더파일의 구조체를 수정한다면, 컴파일을 했을 경우, 에러가 발생하지 않습니다.

 

----------------------------------------------------------------------------------

typedef struct node {
        int data;
        struct node* next;
} NODE;

----------------------------------------------------------------------------------

 

정말 간단한 거지만, 구조체에 대해 이런 경험이 없는 분들은 당황할 수 있습니다.

 

이상입니다.

728x90
반응형