【问题标题】:Is hidden declaration possible in a project?项目中是否可以隐藏声明?
【发布时间】:2016-02-22 12:07:03
【问题描述】:

在我的项目中,一个 structre 用于多个功能。

像这样:

void function1 (Struct_type1 * pstType1);

但是当我搜索 Struct_type1 的参考资料时,我找不到任何参考资料。这个结构必须在某个地方定义。如何找到定义?

操作系统-Windows

编辑:我认为没有源代码很难回答这个问题,我不能在这里分享那个大项目。所以,我把我的问题改成:

  • 在嵌入式项目中是否可以使用隐藏声明?

(隐藏的意思是没有人可以看到定义。)

【问题讨论】:

  • 加大搜索力度。编译器不是魔术师。
  • 这个结构和函数是你项目的一部分,还是来自一些外部库?
  • 在 VS 中就像右键单击-struct_type1 -> 转到定义一样简单
  • @SKD:我们应该如何提供帮助,因为我们甚至没有源文件?
  • 开始对所有内容进行 grep .h,.c 出去玩一天。

标签: c embedded source-insight


【解决方案1】:

在嵌入式项目中是否可以使用隐藏声明?

如果您可以访问项目中的所有源代码,那么没有。

这仅在一种特定情况下是可能的,即当您有一个没有 C 代码的外部库时,您只有一个头文件和一个目标文件或 lib 文件(或 DLL 等) .

对于这种情况,库头可以(也是良好的做法)在头中前向声明一个不完整的类型,并将实际实现隐藏在您无权访问的 C 文件中。

然后你会在 h 文件中有这样的东西:

typedef struct Struct_type1 Struct_type1;

如果他们想隐藏实现,编译器也可能经常用它自己的库来做这样的事情。 FILE 结构就是一个这样的例子。

【讨论】:

  • 我已将我的项目的整个 Tree 添加到 Source Insight。除了那棵树,没有其他文件。那么有没有可能是source-insight无法访问项目中的一些文件呢?
  • 就.o文件而言,它们在purge时被删除
  • @SKD 我不知道 Source Insight 有什么能力,但任何半体面的 IDE 都应该能够找到声明/定义。如果您右键单击类型名称,通常有一个菜单选项可以找到它。我想不出市场上没有这个功能的任何 IDE。否则,您可以随时下载 Codeblocks 并将整个项目转储到那里,仅用于搜索功能。
  • @SKD 我的意思只是为了检查项目的完整性,而不是为了开发。另外,您的 IDE 是否没有对项目中的所有文件进行文本搜索的选项?你总是可以诉诸于此。
  • @SKD 前向声明 == 声明一个不完整类型的对象。这意味着他们已经将他们的库实现为不透明类型。 Here is an example.
【解决方案2】:

不是答案,但可能是找到答案的方法。理念:让编译器帮助你。

自己定义结构,然后查看编译器错误,例如“struct struct_type1 is already defined in... at line ...”

如果在这种情况下没有编译器错误,则结构可能只是前向声明,但未定义。

为了解释为什么有时会这样做,这里有一些代码:

// Something.h

struct struct_type1; // Forward declaration.
struct struct_type1 *SomethingInit();
void SomethingDo( struct struct_type1 * context );

在类似上面的代码中,结构的定义隐藏在实现中。在外部,不需要知道结构是如何定义的或其大小等,因为它仅作为指向结构的指针进行交易(而不是作为值)。这种技术用于将内部类型排除在公共头文件之外,并且经常被库设计者使用。您可以将其视为某种不透明的句柄。

但是,您仍然应该能够找到前向声明,尽管不是定义。

【讨论】:

  • 嘿!好计划:)我知道错误消息有好处。
  • 如果结构是不完整的类型则不起作用。充其量你会得到一个链接器错误,它可能不像编译器错误那样具体。
  • 好的,那么,如果你故意破坏你的原始声明会发生什么?更改为“void function1 (Struct_type1z * pstType1);”。编译器是否会生成任何带有预期错误的提示?
  • @SKD 增加了一点答案。 (重新加载..)
  • 感谢您的努力,但即使是这样声明,我也必须能够找到那个声明。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多