Правильная структура заголовка C - PullRequest
1 голос
/ 29 ноября 2011

Как правильно структурировать заголовки? Есть несколько похожих вопросов, но ни один из них не дает хорошего ответа. Прямо сейчас я использую это:

#ifndef INCLUDE_FILENAME
#define INCLUDE FILENAME

/* Includes */

/* Constants, enums */

/* Structure */

/* Globals */

/* Function prototypes */

#include "File.c"

#endif

Затем я # включаю заголовок из программы.

У этого есть много проблем с необходимостью включать вещи в правильном порядке, и я совершенно уверен, что это неправильная структура.

В идеале это должно работать при отдельном построении файла и сборке модулей.

Смежный вопрос: должны ли глобальные переменные быть реализованы в заголовке или определены как extern и реализованы в исходном файле?

Ответы [ 3 ]

3 голосов
/ 29 ноября 2011

В идеале, заголовочный файл не должен определять какие-либо данные или код. Это означает, что глобальные переменные должны быть только объявлены в заголовке и затем определены в исходном файле.

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

Кроме того, исходные файлы вообще не предназначены для включения, каждый исходный файл обычно передается компилятору напрямую.

1 голос
/ 29 ноября 2011

Мне, например, не нравится этот подход, мое решение не переносимо, но я не планирую переносить его на любую другую платформу. Я использую расширение #pragma once IAR, которое заставляет компилятор включать этот файл только один раз, независимо от того, сколько раз он включен.

Вот пример, взятый из Wikepdia, о том, как он используется:

#pragma once

struct foo 
{
    int member;
};

Вместо:

#ifndef GRANDFATHER_H
#define GRANDFATHER_H

struct foo
{
    int member;
};

#endif /* GRANDFATHER_H */

Я думаю, что это намного более чистый подход ...

Согласно Википедии , эта директива поддерживается также в Clang, Comeau C / C ++, Digital Mars C ++, GCC, компилятор Intel C ++, Microsoft Visual Studio Так что на практике это вполне переносимо ...:)

0 голосов
/ 29 ноября 2011

Это дело вкуса, вы должны только убедиться, что вещи объявлены или объявлены заранее, прежде чем они будут использованы, что зависит от вашего кода.

И вы обычно не включаете #include .c в заголовках.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...