gpt4 book ai didi

c - 了解 c 中不同风格的#defines

转载 作者:太空狗 更新时间:2023-10-29 15:56:30 25 4
gpt4 key购买 nike

我查看了 C 编程语言的不同源代码,发现使用了不同风格的#define。

我从技术上知道他们的用例,无论他们的风格如何,他们都会按预期工作,但根据编码指南,我想问一下他们是什么意思以及何时使用特定的。

#define MY_DEFINE_H

#define MY_DEFINE_H_

#define MY_DEFINE_H__

#define __MY_DEFINE_H__

另外,如果可能的话,请分享一些引用资料,以便我可以详细了解其中的内容。

最佳答案

请注意,通常情况下,您不应创建以下划线开头的函数、变量、标记或宏名称。 C11 §7.1.3 Reserved identifiers的一部分说:

  • 所有以下划线和大写字母或另一个下划线开头的标识符始终保留供任何使用。
  • 所有以下划线开头的标识符始终保留用作普通和标记 namespace 中具有文件范围的标识符。

另见 What does double underscore (__const) mean in C?

这意味着姓氏(__MY_HEADER_H__)可以被“系统”头文件使用(而其他的不能被系统头文件使用)。请注意,一个常见的问题是新程序员会查看系统 header 的作用并复制它们,而没有意识到“实现”(我称之为系统 header )提供的 header 规则与编写的 header 遵循不同的规则由用户。因此,人们无意中践踏了系统命名空间,认为这是一个好主意,因为这是系统 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 guards 是至关重要的(异常(exception)情况很少见)。但是 header 本身之外的代码通常不会知道该名称。

我倾向于对文件 header.h 使用 HEADER_HHEADER_H_INCLUDED(而且我很少使用“my”作为前缀任何东西),但名称无关紧要,只要它是唯一的(文件的 MD5 校验和可能没问题——这不是安全应用程序)。

关于c - 了解 c 中不同风格的#defines,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57729743/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com