2012-02-27 1 views
1

У меня есть заголовочный файл, который начинается так:В C, каково минимальное требование для реализации файла заголовка?

typedef struct PriorityQueueStruct PriorityQueue; 

/** 
* Type definition for an Element. 
*/ 
typedef struct ElementStruct 
{ 
    int element; 
} Element; 

/** 
* Type definition for a priority. 
*/ 
typedef struct PriorityStruct 
{ 
    int priority; 
} Priority; 

/** 
* Structure for containing the resultant values for a 
* call to 'createPriorityQueue'. 
* 
* 'token' is the identifier for the created data structure 
*  and is to be used in any call to query or modify it. 
* 'resultCode' tells whether the function was successful or not in creating a 
*  priority queue. 1 for success or an error code describing the failure. 
*/ 
typedef struct InitializationResultStruct 
{ 
     PriorityQueue* pq; 
     int resultCode; 
} InitializationResult; 

/** 
* Structure for containing the resultant values for a 
* call to 'peek'. 
* 
* 'peekedValue' is the first-most value from the priority queue 
* 'resultCode' tells whether the function was successful or not in creating a 
*  priority queue. 1 for success or an error code describing the failure. 
*/ 
typedef struct PeekResultStruct 
{ 
     Element element; 
     Priority priority; 
     int resultCode; 
} PeekResult; 

Я немного потерял о том, как реализовать этот файл заголовка в моем простом классе, который является приложением для приоритетной очереди (так называемый TriageQueue). Я оставляю структуры только в файле заголовка? Как я могу реализовать функции (спасибо за подсказку!)? Я ценю любую помощь!

ответ

1

Во-первых, я предлагаю в вашем файле заголовка «охранник», который предотвратит проблемы с сообщениями об ошибках компилятора на основе повторяющихся определений (если они есть в файле заголовка). Вы можете сделать это, поместив следующие директивы C-препроцессор в верхней части заголовка файла:

#ifndef YOUR_HEADER_FILE_NAME_H 
#define YOUR_HEADER_FILE_NAME_H 

//...the contents of your header file 

#endif //<== Place this at the very end of the header. 

Далее в файле .c, ради простоты, поместите файл заголовка в том же каталоге, что и. c, а затем напишите директиву C-preprocessor #include "MyCodeFile.h" в верхней части вашего .c файла. Вам также нужно будет включить любые другие заголовки из стандартной библиотеки C, в которой вы используете такие функции, как printf, malloc и т. Д. Поскольку эти заголовки из стандартной библиотеки не будут находиться в том же каталоге, что и ваш .c-файл, вам нужно будет использовать угловые скобки с этими заголовками, которые предписывают компилятору искать файлы среди набора каталогов поиска, которые были определены в вашей среде разработки (большая часть этого материала уже должна быть настроена для вас, поскольку они в стандартных местах, таких как /usr/include и т. д.) Например, #include <stdio.h> будет включать функции ввода-вывода из стандартной библиотеки C.

Наконец, в файле .c, как только вы включили заголовочный файл, просто создать определения ваших функций и т.д. из деклараций, которые вы создали в файле заголовка. Например, если у вас есть следующие в файле заголовка:

void function(int a, int b); 

Затем в файле .c, вы на самом деле создать определение как:

void function(int a, int b) { ... } 

В случае структурообразующих такие типы, как ваш текущий заголовок, «определение» будет фактическим объявлением экземпляра этого типа структуры. Это, конечно, может происходить внутри функции, выделяя объект struct в стеке, или его можно было бы назначить статически как глобальную переменную, или вы могли бы динамически распределять память для вашего объекта struct с использованием malloc.

+0

Большое спасибо Джейсону! – Coffee

+1

Идентификаторы, начинающиеся с символа подчеркивания, зарезервированы для реализации в C. Вот почему заголовки системы будут иметь, например, '#ifndef _STDIO_H'. В вашем собственном коде вы должны просто использовать '#ifndef YOUR_HEADER_FILE_NAME_H', без главного подчеркивания. – ataylor

+0

Хорошо, исправлено, спасибо. – Jason

2

C не имеет классов или методов. Он имеет функции.

И да, предполагая, что вы должны реализовать этот конкретный интерфейс, конечно, вам нужно оставить объявления в одиночку.

Кажется, что это сломанный, комментарии ссылаются на имена, которые не отображаются в объявлениях (token и peekedValue).

+0

C = функции, получили его!И вы правы, это немного сломано, очень много работы. Спасибо! – Coffee

2

Реализация продолжается .c, .cpp файлы.

О том, следует ли включать другие определения, это зависит от вас и вашего дизайна. ИМХО, если структуры имеют отношение к классу, я помещу их в тот же заголовок, что и класс.