使用#ifndef #define #endif对C头文件进行最佳练习

gue*_*est 13 c coding-style header

关于以下"模式"的最佳实践是什么?

#ifndef BLAFOO_H
#define BLAFOO_H
/* ...
 * ...
 */
#endif /* BLAFOO_H */
Run Code Online (Sandbox Code Playgroud)

我应该如何命名#define指令中的标题?我已经看到了从说BLAFOO_H__BLAFOO_H_BLAFOO_H_等.

nos*_*nos 22

命名它们BLAFOO_H(我个人使用的BLAFOO_H_地方是BLAFOO是头文件名).

确保您的BLAFOO不与其他文件/库/等冲突.您正在使用,例如,您的项目和/或模块名称是该名称的一部分.

以a开头的标识符_是为实现/编译器保留的,所以不要使用它.

  • 提及以_ _`开头的标识符的+1是为实现保留的 (5认同)

Aoi*_*asu 5

我使用的UUID是我保证#define不会与其他人发生冲突的保证.我已经在某个地方看到它,并决定也使用它.

我的模式是这样的:__<filename>_H_<uuid>__,

例如.#define __TYPES_H_79057761_16D6_478A_BFBC_BBF17BD3E9B9__对于一个名为的文件types.h

  • 我也认为使用GUID是一个好主意,但有几条评论 - 严格来说你不应该使用`__`前缀,因为它是为实现保留的(尽管与GUID冲突的可能性很小).此外,您很可能会发现团队中的其他人不喜欢它 - 至少我发现了这一点.在那种情况下,我不推动它,因为我不记得包含警卫冲突实际上导致问题的情况. (2认同)

Ism*_*awi 1

只要它不太可能在其他地方使用,这并不重要。我通常会选择类似的东西BLAFOO_H_INCLUDED