在C语言中将文本文件包含在结构体中

4

有一个包含文本文件的结构。

struct student
{
  #include "test"
};

测试文件是一个纯ASCII文本文件,包含以下信息:

UU2(testing,value,21);

我不确定将文本文件包含在结构中意味着什么,以及我们将从中获得什么好处。

请问有人能帮助解答这个问题吗?


很难知道它的含义。你需要在其他文件中找到UU2是什么。如果你使用Linux,可以尝试类似于grep -r '#define.*UU2' ./include/的命令。 - tivn
我甚至不确定UU2是什么,而我使用的操作系统是LINUX。 - user3160866
在查找时,我发现UU2是在其他文件中定义的宏。 - user3160866
3
UU2 很可能是一个宏。#include 和其他预处理指令可以放在任何独立的行上;预处理器不知道底层 C 语法,并在 C 编译器看到代码之前解析宏和包含文件。许多编译器有一个标志,允许您查看预处理后的源代码,例如 gcc -E stuff.c - M Oehm
2
将结构体主体存储在外部文件中的一个可能原因是,您的构建过程可以根据某些设置自动创建“test”。 - M Oehm
需要记住的一件事是,调用宏的这种方法会增加文件之间的“耦合”,这是一件坏事。文件之间的“耦合”会使调试、维护等工作变得更加困难,并使代码更难理解。 - user3629249
1个回答

1

没有上下文或UU2的定义,很难确定这里发生了什么,但这看起来很像通常称为X宏的常见C模式。通常包含文件中会有更多行。

X宏用于颠倒运算符和操作数之间的关系(即宏和数据之间的关系)。使用普通宏,关系是一个定义 -> 多个输入,即#define M()...将在代码中跟随M(foo)M(bar)等等;一个M操作被重复地应用于多个不同的输入。

相比之下,X宏具有“多个定义”->“一个输入”的关系。输入表示为一组宏调用块,然后周围的代码会设置适当的宏定义,以使这些应用程序扩展为有用的内容。这样做的好处是,可以将相同的调用块重复粘贴到程序中的不同上下文中,在其中设置了控制宏的不同定义,以创建相同基本输入数据的不同扩展。例如,相同的输入块(在“block.x”中):
M(one, 7);
M(two, 8);
M(three, 9);

根据上下文和M的可见定义,它可以被解释为结构声明、结构初始化或对结构元素进行展开循环。

// context 1: declare a struct
#define M(N, V) int N;
struct foo {
    #include "block.x"
};

// context 2: initialize a struct
#define M(N, V) .N = V,
struct foo f = {
    #include "block.x"
};

// context 3: do something to a struct
#define M(N, V) if(THIS.N==8)puts("eight!");else puts("not eight");
#include "block.x"  // prints "not eight", "eight!", "not eight"

将宏语句块放入单独的文件中,使其能够轻松地在多个不同的扩展上下文中进行 #include,从而使单个结构化数据定义具有多个应用。将公共结构集中于一个文件中可以提高可维护性,通过立即将数据结构的任何更改传播到程序中的所有位置来实现。 (#include 不是唯一的方式,但这是常见的模式)
为什么在这里使用这种模式,看起来只有一行和一个 UU2 的定义?嗯,同样的原则仍然适用-尽管程序当前没有在多个位置应用结构化数据,但意味着生成它的任何进程/人都不需要知道关于 C 程序如何解释他们提供的纯抽象结构的任何信息。他们只需关注布局,无需了解它是类型定义的一部分以及如何将其编辑到源文件中 (或者 C 有这样的类型定义,或者甚至该程序是用 C 编写的)。他们提供抽象的结构和值,C 程序将对数据施加自己的含义。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接