正确的C头结构

时间:2011-11-29 14:35:55

标签: c module header

构造标题的正确方法是什么?有一些类似的问题,但没有一个给出一个好的答案。现在我用这个:

#ifndef INCLUDE_FILENAME
#define INCLUDE FILENAME

/* Includes */

/* Constants, enums */

/* Structure */

/* Globals */

/* Function prototypes */

#include "File.c"

#endif

然后#include程序中的标题。

在必须以正确的顺序包含事物方面存在很多问题,而且我很确定这是错误的结构。

理想情况下,它应该在构建单个文件和单独构建模块时起作用。

一个相关的问题是:全局变量应该在标题中实现,还是定义为extern并在源文件中实现?

3 个答案:

答案 0 :(得分:3)

理想情况下,头文件不应定义任何数据或代码。这意味着全局变量只应在标题中声明,然后在源文件中定义

头文件的目的是为编译器提供提示,而不是包含实际的数据和代码。

此外,根本不包含源文件,每个源文件通常直接传递给编译器。

答案 1 :(得分:1)

例如,我不喜欢这种方法,我的解决方案不可移植,但我不打算将其移植到任何其他平台。 我正在使用#pragma once IAR编译器扩展,这会导致编译器只包含此文件一次,无论它包含多少次。

以下是从Wikepdia中获取的一个示例,它是如何使用的:

#pragma once

struct foo 
{
    int member;
};

而不是:

#ifndef GRANDFATHER_H
#define GRANDFATHER_H

struct foo
{
    int member;
};

#endif /* GRANDFATHER_H */

我认为这是更清洁的方法......

根据Wikipedia,该指令也得到支持 Clang,Comeau C / C ++,Digital Mars C ++,GCC,Intel C ++编译器,Microsoft Visual Studio 所以在实践中它非常便携......:)

答案 2 :(得分:0)

这是一个品味问题,你应该确保在使用之前声明或转发声明,这取决于你的代码。

您通常不会在标题中加入#include .c