문제

내가 이것에서는 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 파일로 이동하십시오.

  1. 는 .c 파일이 아닌 헤더에서 struct T를 정의합니다.
  2. 구조와 typedef에 대한 다른 이름을 선택하십시오.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top