我查看了C编程语言的不同源代码,发现#define的使用风格不同。
我从技术上知道他们的用例,不管它们的样式如何,它们都可以按预期工作,但是从编码准则出发,我想问一下它们的含义以及何时使用特定的。
#define MY_DEFINE_H
#define MY_DEFINE_H_
#define MY_DEFINE_H__
#define __MY_DEFINE_H__
Run Code Online (Sandbox Code Playgroud)
另外,如果可以的话,请分享一些参考,以便我详细介绍。
请注意,通常,您不应创建以下划线开头的函数,变量,标记或宏名称。部分C11§7.1.3保留标识符说:
这意味着姓氏(__MY_HEADER_H__)可以由'system'头使用(其他名称不能由系统头使用)。请注意,一个常见的问题是新程序员希望查看系统头文件的功能并进行复制,而没有意识到“实现”提供的头文件的规则(我称为系统头文件)要遵循与编写的头文件不同的规则由用户。因此,人们不经意间践踏了系统名称空间,认为这是一个好主意,因为这就是系统头文件所做的事情,而没有意识到他们一定不能这样做,以便可以安全地编写系统头文件。
从技术上讲,您可以自己使用其他三个名称中的任何一个。我不喜欢结尾的下划线,因此在没有令人信服的理由的情况下不使用它们。这些标头防护装置是否可以防止出现多个夹杂物?
#ifndef MY_HEADER_H
#define MY_HEADER_H
…
#endif /* MY_HEADER_H */
Run Code Online (Sandbox Code Playgroud)
如果名称用于标题后卫,则使用单下划线或双下划线表示它们不太可能与其他名称发生冲突。您不太可能引用这些宏。您应该抵制尝试写入其他源文件的诱惑:
#ifndef MY_HEADER_H__
#include "my_header.h"
#endif
Run Code Online (Sandbox Code Playgroud)
标头中的名称可能会更改。标头包含一组标头防护(至关重要的例外)是至关重要的。但是,标头本身之外的代码通常不应该知道该名称。
我倾向于使用HEADER_H或HEADER_H_INCLUDED用于文件header.h(并且很少使用“我的”作为任何前缀),但是名称并不重要,只要它是唯一的(文件的MD5校验和就可以了) —这不是安全应用程序)。