构造标题的正确方法是什么?有一些类似的问题,但没有一个给出一个好的答案。现在我用这个:
#ifndef INCLUDE_FILENAME
#define INCLUDE FILENAME
/* Includes */
/* Constants, enums */
/* Structure */
/* Globals */
/* Function prototypes */
#include "File.c"
#endif
然后#include程序中的标题。
在必须以正确的顺序包含事物方面存在很多问题,而且我很确定这是错误的结构。
理想情况下,它应该在构建单个文件和单独构建模块时起作用。
一个相关的问题是:全局变量应该在标题中实现,还是定义为extern并在源文件中实现?
答案 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
。