【问题标题】:Defining a function that passes a struct in a C header定义一个在 C 标头中传递结构的函数
【发布时间】:2015-02-20 23:18:10
【问题描述】:

标题有些问题。 我有一个标题data.h,其中包含typedef struct newPerson 的结构信息。

data.h 在我的源代码menu.c 中使用。在menu.c 中,我有一个函数void addStudentRecord(newPerson pers)。 代码可以按需要编译和工作。

但是,我需要将所有函数添加到我的 menu.h 标头中。当我将 void addStudentRecord(newPerson pers); 添加到 menu.h 时,我收到此错误 unknown type name ‘newPerson’

我试图通过添加#include "data.h 来解决这个问题,但这只会给我带来更多错误。我想知道如何定义一个在头文件中采用结构的函数?

【问题讨论】:

  • 将整个结构传递给函数是一个非常糟糕的主意。这样的代码会导致编译器(至少)插入对 memcpy() 的调用,并分配一些其他任何东西都无法访问的内存。强烈建议只传递一个指向结构的指针。注意:该结构确实需要在使用该结构的函数原型之前定义(在头文件中)

标签: c struct header


【解决方案1】:

您可以将指向不完整结构类型的指针传递给函数,但如果您想传递结构的副本,则它必须是完整类型。也就是说,您必须看到完整的 struct structname { ... } 定义才能传递结构的副本。

data.h 中定义的类型似乎是不完整的类型,因此您不能使用它来声明需要结构副本的函数。但是您可能希望函数无论如何都接受指向结构的指针。

另见:

【讨论】:

    【解决方案2】:

    听起来你需要include guards。包含保护可防止头文件被多次包含。

    例如,如果您有包含data.hmenu.h,并且您有包含data.hmenu.c menu.h,那么data.h 中的所有内容都会包含两次,这会导致各种错误。

    通过添加如下所示的包含保护,您可以保证data.h 的主体只包含一次

    // data.h
    
    #ifndef DATA_H
    #define DATA_H
    
    // the rest of data.h goes here
    
    #endif /* DATA_H */
    

    一些编译器允许你使用#pragma once 来做同样的事情

    // data.h
    
    #pragma once
    
    // the rest of data.h goes here
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-23
      相关资源
      最近更新 更多