gpt4 book ai didi

c - 以这种方式包含头文件,这是一个好的做法吗?

转载 作者:行者123 更新时间:2023-12-02 18:57:44 25 4
gpt4 key购买 nike

在gumbo html解析器源代码中,我看到了一些奇怪的#include用例,如下所示。它们只是在数组定义 block 中包含头文件。

const char* kGumboTagNames[] = {
#include "tag_strings.h"
"", // TAG_UNKNOWN
"", // TAG_LAST
};

static const unsigned char kGumboTagSizes[] = {
#include "tag_sizes.h"
0, // TAG_UNKNOWN
0, // TAG_LAST
};

然后在tag_string.h文件中列出所有合法的html标签,

"html",
"head",
"title",
"base",
"link",
"meta",
"style",
"script",
"noscript",
...
...

我知道它有效,但仍然想知道这是否是导入外部数据的传统方式,或者这只是一种不寻常的黑客攻击?

最佳答案

这是使用 #include 的一种不错且有些传统的方式,如果您要包含的数组内容是由一些其他过程。 (不过,还有其他方法可以做到这一点,我将在下面提到。)

这是一个经典的权衡。大多数时候,一个值得遵循的好规则是,您应该以简单、传统的方式使用预处理器,因为当您开始变得“​​棘手”时,很容易造成困惑。

但有时,您确实想使用某些自动的外部过程生成一个数组,其内容是生成的。将数组定义复制并粘贴到源文件中会很乏味且容易出错,并且您可能必须在数组需要更新时不断重做。找出一种自动化流程的方法是值得做的,甚至可能值得违反“不滥用预处理器”规则。

为了完成这项工作,您通常需要一些自动进程(可能是 awk、sed、perl 或 python 脚本)来生成具有正确语法的包含文件。如果您使用 make 或类似的东西,只要数组的实际源数据发生变化,您就可以自动执行该步骤。例如,在您给出的示例中,您可能有一个原始的“源文件”tags.list,其中包含诸如

之类的行
html
head
title

然后在 Makefile 中使用诸如 sed 's/.*/"&",' 之类的内容来创建具有正确字符串初始值设定项语法的包含文件。这样,您就不会强制更新列表的人记住始终使用正确的引号和逗号。

此外,正如其他评论者所建议的那样,您应该为该文件指定一个以 .h 以外的内容结尾的名称,以明确它不是包含完整、有效的 C 声明的普通头文件。在这种情况下,更好的可能性是 .tab.inc.arr

不过,只要多做一点工作,您就可以避免“黑客”,并以 100% 传统方式完成工作。如果您调整脚本以在生成文件的开头添加行 const char* kGumboTagNames[] = { ,并在末尾添加 }; ,您可以给它以 .c 结尾的名称,只需编译它,而不是包含它。 (然而,这种方法会涉及到它自己的权衡,因为它会将数组限制为全局的,而不是静态的或本地的。)

脚注:在某些语言中,甚至在 C 和 C++ 中,在某些情况下,逗号被用作分隔符,并且不允许在最后一个元素之后有一个一个列表。但在数组初始值设定项中,您可以使用尾随逗号,事实证明这是一种非常好的且有用的自由,正是因为它允许您使用像此处描述的那样简单的技术,而不必插入一个麻烦的东西显式的额外步骤来删除列表中最后一个元素后面的逗号。

关于c - 以这种方式包含头文件,这是一个好的做法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65957739/

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