【问题标题】:including a text file in a structure in c在 c 的结构中包含文本文件
【发布时间】:2015-06-17 22:31:02
【问题描述】:

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

struct student
{
  #include "test"
};

test 是一个纯 ASCII 文本文件,包含以下信息

UU2(testing,value,21);

我不确定这是什么意思,以及通过在结构中包含文本文件将获得什么好处。

有人可以帮我解决这个问题吗?

【问题讨论】:

  • 很难知道这意味着什么。您将需要在其他文件中的某处找到 UU2 是什么。如果您使用 Linux,可以尝试使用 grep -r '#define.*UU2' ./include/ 之类的东西。
  • 甚至不确定什么是 UU2 并且正在使用的操作系统是 LINUX
  • 环顾四周,我发现 UU2 是在其他文件中定义的宏
  • UU2 可能是一个宏。 #include 和其他预处理器指令可以放在自己行的任何位置;预处理器不知道底层的 C 语法并在 C 编译器看到代码之前解析宏和包含。许多编译器都有一个标志,允许您查看预处理的源代码,例如gcc -E stuff.c.
  • 将结构体存储在外部文件中的一个可能原因是您的构建过程可以根据某些设置自动创建"test"

标签: c include c-preprocessor


【解决方案1】:

如果没有上下文或UU2 的定义,就不可能确定这里发生了什么,但这看起来很像称为X macros 的常见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"

将宏语句块放在自己的文件中,可以轻松地将#included 放入多个不同的扩展上下文中,从而允许单个结构化数据定义具有多个应用程序。将通用结构集中在一个文件中有助于可维护性,因为它可以立即将数据结构中的任何更改传播到程序中各处的解释方式。

#include 不是唯一的方法,但它是常见的模式)

为什么在这里使用这个模式,似乎只有一行和一个UU2 的定义?好吧,同样的原则仍然适用 - 即使程序当前没有在多个位置应用结构化数据,它仍然意味着无论进程/人正在生成它不需要知道任何东西关于 C 程序如何解释它们提供给它的纯抽象结构。他们可以只关注布局,而不需要知道它构成类型定义的一部分以及如何将其编辑到源文件中(或者 C 有类型定义之类的东西,甚至程序是用 C 编写的)。它们提供了抽象的结构和值,C 程序将赋予数据自己的意义。

【讨论】:

    猜你喜欢
    • 2019-06-24
    • 2015-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多