2017-11-13 1 views
1

이 프로젝트에 대한 액세스 권한이 있습니다. Keil μvision 5에서 컴파일됩니다. 프로젝트를 컴파일 할 때 오류가 없습니다. 그러나 헤더 파일에 액세스하면 s8 변수에 다음 오류가 있음을 알리는 오류가 표시됩니다. 오류 : 알 수없는 형식 이름 's8'.Keil μvision 5 헤더 파일에 오류가 표시되지만 문제없이 컴파일됩니다.

typedef struct 
    { 
     s8 str[PARAM_TEXT_SIZE]; 
    } 
    text_struct; 

이 변수는 다음과 같이 정의된다 :

typedef char s8; 

은 내가 컴파일러를 잘못 여부를 궁금해, 또는 왜이 오류는 컴파일 한 후 무시됩니다.

추신 : 이것은 StackOverflow 사이트의 첫 번째 질문입니다. 미안 내 질문이 명확하지 않거나 잘못 배치하는 경우. s8이 헤더에 정의되어

+2

예를 들면 다음과 같습니다입니까? 이러한 파일은 어느 위치에 있습니까? 's8'은 표준이 아닙니다. 또한 unsigned 일 수 있기 때문에 'char'를 signed 8로 typedef하는 것은 매우 나쁜 생각입니다. 당신이해야 할 일은 (1999 년 이래로)'stdint.h'를 사용하는 것이지 집에서 만든 정크 타입은 사용하지 않는 것입니다. – Lundin

+0

@Lundin '(1999 년 이래로)'-> 올해부터 크로스 컴파일러 제공 업체는 21 세기를 깨닫고 있습니다. * 198X *에서 울부 짖었다. (ARM 컴파일러가 최신 버전입니다.) – Tim

+0

Hello @ Lundin, 내가이 코드를 가지고 있다고 말했기 때문에. 일반적으로, 나는 당신이 'stdint.h'라고 말한 것처럼 사용할 것입니다. 하지만 이것은 큰 코드 (100,000 개 이상의 코드 행)이며이 변수는 코드에서 널리 사용됩니다. ARM 마이크로 컨트롤러 용 'typedef_arm.h'파일에 정의되어 있습니다. 그리고 이것은 마이크로 컨트롤러의 이진 계산에 중요하기 때문에 부호있는 변수로 정의됩니다. –

답변

0

경우의이 foo.h을 가정 해 봅시다하고 text_struct 다른 헤더에 정의되어, bar.h을 포함하는 파일이 첫 번째 foo.h가 포함 된 경우가 bar.h 다음 완벽하게 컴파일 호출합니다. 그러나 깨끗하지는 않습니다. 일반적으로 그러한 필수 구성 요소에 의존하지 않는 것이 좋습니다.

여기 아주 간단한 예입니다 :

foo.h

typedef int myType; 

bar.h

typedef struct { 
    myType x; 
} myStruct; 

main.c를

#include <stdio.h> 
#include <stdlib.h> 
#include <stdint.h> 

#include "foo.h" 
#include "bar.h" 

myStruct y; 

int main(void) { 
    return 0; 
} 

이 문제는 아무런 문제없이 컴파일되지만, bar.h이 정적으로 평가 된 경우 여기에 myType을 알지 못하므로 오류가 발생합니다. bar.hfoo.h없이 포함 된 경우에도 컴파일 오류가 발생합니다.

error.c 변수 어디를 정의

#include "bar.h" 

myStruct z; 

gcc -I. error.c -o error.o

In file included from error.c:1:0: bar.h:2:5: error: unknown type name 'myType' myType x;

+0

안녕하세요 @TimF, 답변 해 주셔서 감사합니다. 그러나, 나는이 얘기를 깜빡 했네요, 헤더 파일의 선언은 다음과 같이이다 : '_PARAM_H' '#ifndef #DEFINE _PARAM_H' ', '# endif' 내가 그렇게 선언의이 유형에 익숙해 있지 않다을 code' 그래서 여기에 헤더 파일을 선언 할 수 있는지 모르겠습니다. –

+0

예. 이 'PARAM_H'는 헤더를 두 번 이상 포함 할 수 없도록 막는 보호 장치입니다. 각 헤더의 맨 위에 놓는 것이 표준이며 헤더 + H의 대문자로 된 이름을 가져야합니다. 예제에서는'_FOO_H'와'_BAR_H'가됩니다. [Wikipedia의 Guard 포함] (https://en.wikipedia.org/wiki/Include_guard)을 참조하십시오. 내 대답이 유용하다면 주저하지 말고 upvote and accept. 그런데 StackOverflow에 오신 것을 환영합니다! – Tim

+0

감사합니다. @TimF! 나를 위해 잘 일했다. 따뜻한 환영에 감사드립니다! :) –

관련 문제