문제
내가 이것에서는 C file:
struct T
{
int foo;
};
C 파일에 포함하 h 파일인:
typedef struct T T;
void listInsertFirst(T data, int key, LinkedList* ListToInsertTo);
기능 listInsertFirst
중고 경고한다.어떻게 그것을 해결할 수 있습니까?
해결책
우리가 발견한 의견에,문제의 정의 struct T
후에 발생한의 정의 T
에 헤더가 있습니다.당신은 정말 일을 뒤로 여기에.헤더에해야한을 정의하는 모든 종류 및 함수 프로토 타입하고 귀하의 C 파일을 사용해야 하니다.
당신이 원하는 무엇을 하는 대신 서명을 변경의 삽입 기능을 받는 포인터를 데이터와 데이터의 크기.그 다음에 할당할 수 있는 몇 가지 메모리에 대한 데이터 복사 및 저장합니다.당신이 필요로 하지 않는 특정 유형,단지 그것을 선언 a void *
.
void listInsertFirst(void *data, size_t data_size, int key, LinkedList* ListToInsertTo);
다음 호출자가 일반적으로 다음과 같은 것이 가능합니다.
struct T { int foo; };
struct T x = { ... };
int someKey = ...;
LinkedList *someList = ...;
listInsertFirst(&x, sizeof x, someKey, someList);
다른 팁
헤더 파일을 포함하면 컴파일러는 T
가 알 수없는 크기의 구조이고 listInsertFirst
가 첫 번째 인수로 원하는 것을 원한다는 것을 알고 있습니다.그러나 컴파일러는 listInsertFirst
매개 변수의 스택을 누르기위한 바이트의 크기를 알지 못하면 T data
의 크기가 얼마나 많은 바이트를 푸시하는지 알지 못하면 T
가 정의 된 파일 내에서만 알려져 있습니다.
최상의 솔루션은 listInsertFirst
를 변경하여 listInsertFirst
를 첫 번째 인수로 사용하여 머리글 파일이 다음과 같이 말합니다.
extern void listInsertFirst(T *data, int key, LinkedList* ListToInsertTo);
.
은 T*
데이터 유형에 불투명 한 포인터를 얻을 수 있으며 모든 포인터가 동일한 크기 (최소한 최소한)와 동일한 크기이므로 컴파일러는 T
를 호출 할 때 스택을 작성하는 방법을 알고 있습니다.
당신은 확실히 그것은 첫 번째 매개 변수는 문제입니까?확실히,변경해 보십시오 매개변수 유형 T
하기 int
다.더 많은 가능성이 보다,세 번째 매개 변수는 실제로 문제입니다.
많은 컴파일하지 않는 점에서 문제가에서 이러한 종류의 문제가 아니다.
TypeDEF 앞에 구조 정의를 H 파일로 이동하십시오.
- 는 .c 파일이 아닌 헤더에서
struct T
를 정의합니다. - 구조와 typedef에 대한 다른 이름을 선택하십시오.