Я хочу включить внешнюю библиотеку в свой проект, но у меня есть некоторые проблемы с ним.Сложная ошибка (ожидаемые спецификаторы декларации или «...» до «size_t»)
Моя структура проекта:
Project folder/ --- sources/ --- main.c
--- libs/ --- Queue.c
--- Sllist.c
--- headers/ --- main.h
--- libs/ --- Queue.h
--- Sllist.h
main.c:
#include "main.h"
#include "Queue.h"
QUEUE q = {0};
int main(void)
{
return 0;
}
main.h:
#ifndef MAIN_H__
#define MAIN_H__
#endif
Queue.c:
#define NDEBUG // if defined then delete assert checks
#include <string.h>
#include <assert.h>
#include "Queue.h"
int QueueAdd(QUEUE *Queue,
int Tag,
void *Object,
size_t Size)
{
// many code
}
// Also many code
Queue.h:
#ifndef QUEUE_H__
#define QUEUE_H__
#include "Sllist.h"
typedef struct
{
#ifndef NDEBUG
int CheckInit1;
#endif
SLLIST *HeadPtr;
SLLIST *TailPtr;
size_t NumItems; // line 49
#ifndef NDEBUG
int CheckInit2;
#endif
} QUEUE;
int QueueAdd(QUEUE *Queue,
int Tag,
void *Object,
size_t Size); // line 59
// Also many code
#endif
Sllist.c:
#define NDEBUG // if defined then delete assert checks
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include "Sllist.h"
int SLAdd(SLLIST **Item,
int Tag,
void *Object,
size_t Size)
{
// many code
}
// Also many code
Sllist.h:
#ifndef SLLIST_H__
#define SLLIST_H__
typedef struct SLLIST
{
int Tag;
struct SLLIST *Next;
void *Object;
size_t Size; // line 45
} SLLIST;
/* Add new item immediately after current item */
int SLAdd(SLLIST **Item,
int Tag,
void *Object,
size_t Size); // line 52
// Also many code
#endif
Итак, как вы можете видеть мой проект является как можно более чистым. Когда я пытаюсь скомпилировать получить следующие ошибки:
In file included from headers/libs/Queue.h:34:0,
from sources/main.c:7:
headers/libs/Sllist.h:45:3: error: expected specifier-qualifier-list before 'size_t'
headers/libs/Sllist.h:52:11: error: expected declaration specifiers or '...' before 'size_t'
In file included from sources/main.c:7:0:
headers/libs/Queue.h:49:3: error: expected specifier-qualifier-list before 'size_t'
headers/libs/Queue.h:59:14: error: expected declaration specifiers or '...' before 'size_t'
Я попытался включить, что содержит «size_t» определение, но это не помогает.
спасибо, что заблаговременно!
Я попытался включить 'stddef.h' в мои файлы C, но это не сработает. Теперь я включаю 'stddef.h' в файл 'Sllist.h', и компиляция проекта в порядке! Но файл «Sllist.c» также содержит «stdlib.h», почему он не работает в моем случае? – Andrew
@Andrew Поскольку ваш файл c содержит ваш файл h, а не наоборот. Вы используете 'size_t' в h-файле, поэтому в момент компиляции h-файла необходимо объявить' size_t'. – Lundin
@Andrew Вы всегда должны помещать все '# include' в h-файл, так как файл h - это документация интерфейса вашего модуля, которую вы представляете вызывающему. Они могут не иметь доступа к c-файлу. Это означает, что вы также должны использовать файл h в качестве документации обо всех зависимостях, которые имеет ваш модуль. – Lundin