了解 c 语言中不同风格的#defines
Understanding different styles of #defines in c
我查看了 C 编程语言的不同源代码,发现使用了不同风格的#define。
我从技术上知道他们的用例,无论他们的风格如何,他们都会按预期工作,但根据编码指南,我想问一下他们是什么意思以及何时使用特定的。
#define MY_DEFINE_H
#define MY_DEFINE_H_
#define MY_DEFINE_H__
#define __MY_DEFINE_H__
此外,如果可能,请分享一些参考资料,以便我可以在其中进行详细介绍。
请注意,通常情况下,您不应创建以下划线开头的函数、变量、标记或宏名称。 C11 §7.1.3 Reserved identifiers 的一部分说:
- 所有以下划线和大写字母或其他下划线开头的标识符始终保留供任何使用。
- 所有以下划线开头的标识符始终保留用作普通和标记名称空间中具有文件范围的标识符。
另见 What does double underscore (__const
) mean in C?
表示姓氏(__MY_HEADER_H__
)可以被'system'headers使用(其他的不能被系统headers使用) .请注意,一个常见的问题是新程序员会查看系统 header 的作用并复制它们,而没有意识到 'the implementation' 提供的 header 规则(我称之为系统 headers) 遵循与用户编写的 headers 不同的规则。因此,人们无意中践踏了系统命名空间,认为这是一个好主意,因为这是系统 header 所做的,却没有意识到他们必须 而不是 这样做,以便系统header可以安全写入。
从技术上讲,您可以自己使用其他三个名称中的任何一个。我不喜欢结尾的下划线,所以如果没有令人信服的理由,我不会使用它们。这些 header 守卫是为了防止多重包含吗?
#ifndef MY_HEADER_H
#define MY_HEADER_H
…
#endif /* MY_HEADER_H */
如果名字是给 header 守卫的,使用单下划线或双下划线意味着它们不太可能与其他名字冲突。您不太可能引用这些宏。您应该抵制尝试在其他源文件中编写的诱惑:
#ifndef MY_HEADER_H__
#include "my_header.h"
#endif
header 中的名称可能会更改。至关重要的是 header 包含一组 header 守卫(例外情况很少见)。但是 header 本身之外的代码通常不会知道该名称。
我倾向于将 HEADER_H
或 HEADER_H_INCLUDED
用于文件 header.h
(而且我很少使用 'my' 作为任何内容的前缀),但是名称只要它是唯一的就没关系(文件的 MD5 校验和可能没问题——这不是安全应用程序)。
我查看了 C 编程语言的不同源代码,发现使用了不同风格的#define。
我从技术上知道他们的用例,无论他们的风格如何,他们都会按预期工作,但根据编码指南,我想问一下他们是什么意思以及何时使用特定的。
#define MY_DEFINE_H
#define MY_DEFINE_H_
#define MY_DEFINE_H__
#define __MY_DEFINE_H__
此外,如果可能,请分享一些参考资料,以便我可以在其中进行详细介绍。
请注意,通常情况下,您不应创建以下划线开头的函数、变量、标记或宏名称。 C11 §7.1.3 Reserved identifiers 的一部分说:
- 所有以下划线和大写字母或其他下划线开头的标识符始终保留供任何使用。
- 所有以下划线开头的标识符始终保留用作普通和标记名称空间中具有文件范围的标识符。
另见 What does double underscore (__const
) mean in C?
表示姓氏(__MY_HEADER_H__
)可以被'system'headers使用(其他的不能被系统headers使用) .请注意,一个常见的问题是新程序员会查看系统 header 的作用并复制它们,而没有意识到 'the implementation' 提供的 header 规则(我称之为系统 headers) 遵循与用户编写的 headers 不同的规则。因此,人们无意中践踏了系统命名空间,认为这是一个好主意,因为这是系统 header 所做的,却没有意识到他们必须 而不是 这样做,以便系统header可以安全写入。
从技术上讲,您可以自己使用其他三个名称中的任何一个。我不喜欢结尾的下划线,所以如果没有令人信服的理由,我不会使用它们。这些 header 守卫是为了防止多重包含吗?
#ifndef MY_HEADER_H
#define MY_HEADER_H
…
#endif /* MY_HEADER_H */
如果名字是给 header 守卫的,使用单下划线或双下划线意味着它们不太可能与其他名字冲突。您不太可能引用这些宏。您应该抵制尝试在其他源文件中编写的诱惑:
#ifndef MY_HEADER_H__
#include "my_header.h"
#endif
header 中的名称可能会更改。至关重要的是 header 包含一组 header 守卫(例外情况很少见)。但是 header 本身之外的代码通常不会知道该名称。
我倾向于将 HEADER_H
或 HEADER_H_INCLUDED
用于文件 header.h
(而且我很少使用 'my' 作为任何内容的前缀),但是名称只要它是唯一的就没关系(文件的 MD5 校验和可能没问题——这不是安全应用程序)。