2016-02-02 5 views
1

Я хочу включить внешнюю библиотеку в свой проект, но у меня есть некоторые проблемы с ним.Сложная ошибка (ожидаемые спецификаторы декларации или «...» до «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» определение, но это не помогает.

спасибо, что заблаговременно!

ответ

1

slist.h и queue.h необходимо включить stddef.h. Или вы можете включить stdlib.h, который, в свою очередь, включает stddef.h. Как правило, старайтесь всегда включать библиотеки из файла h, а не в файл c.

+0

Я попытался включить 'stddef.h' в мои файлы C, но это не сработает. Теперь я включаю 'stddef.h' в файл 'Sllist.h', и компиляция проекта в порядке! Но файл «Sllist.c» также содержит «stdlib.h», почему он не работает в моем случае? – Andrew

+0

@Andrew Поскольку ваш файл c содержит ваш файл h, а не наоборот. Вы используете 'size_t' в h-файле, поэтому в момент компиляции h-файла необходимо объявить' size_t'. – Lundin

+0

@Andrew Вы всегда должны помещать все '# include' в h-файл, так как файл h - это документация интерфейса вашего модуля, которую вы представляете вызывающему. Они могут не иметь доступа к c-файлу. Это означает, что вы также должны использовать файл h в качестве документации обо всех зависимостях, которые имеет ваш модуль. – Lundin

-1

В исходном файле main.c вы не указываете стандартный файл заголовка библиотеки, который определяет size_t.

Просто добавьте, например.

#include <stddef.h> 

в верхней части main.c исходного файла, прежде чем ваш текущий включает.

+0

Это нехороший дизайн. Каждый модуль кода/ADT должен быть как можно более автономным. Это означает, что он должен включать все ресурсы, которые ему нужны сами по себе. – Lundin