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

SKD*_*SKD 0 c embedded source-insight

在我的项目中,一个structre正在几个函数中使用.

像这样:

void function1 (Struct_type1 * pstType1);
Run Code Online (Sandbox Code Playgroud)

但是当我搜索Struct_type1引用时,我找不到任何引用.必须在某处定义此结构.如何找到定义?

OS-Windows

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

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

(通过隐藏我的意思是没有人能看到定义.)

Lun*_*din 5

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

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

这只能在一个特定的情况下实现,也就是说,当你有一个没有C代码的外部库时,你只有一个头文件和一个目标文件或lib文件(或DLL等).

对于这种情况,库标题可以(并且良好实践)在标头中转发声明一个不完整的类型,并隐藏您无权访问的C文件中的实际实现.

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

typedef struct Struct_type1 Struct_type1;
Run Code Online (Sandbox Code Playgroud)

如果他们想要隐藏实现,编译器可能经常使用自己的库来执行此类操作.一个这样的例子是FILE结构.

  • @SKD前向声明==声明一个不完整类型的对象.这意味着他们已将其库实现为不透明类型.[这是一个例子](http://stackoverflow.com/questions/13032015/how-to-implement-a-class-in-c/13032531#13032531). (2认同)

Bit*_*ler 5

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

自己定义结构,然后查看编译器错误,例如"struct struct_type1已在...中定义......"

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

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

// Something.h

struct struct_type1; // Forward declaration.
struct struct_type1 *SomethingInit();
void SomethingDo( struct struct_type1 * context );
Run Code Online (Sandbox Code Playgroud)

在如上所示的代码中,结构的定义隐藏在实现中.在外部,它不需要知道,如何定义结构或其大小等,因为它只作为指向结构的指针(并且从不作为值)交易.此技术用于将内部类型保留在公共头文件之外,并且经常由库设计者使用.你可以把它想象成一种不透明的手柄.

但是,你仍然应该能够找到前方声明,尽管不是定义.