簡體   English   中英

如何在 header 文件中聲明結構並在 .c 文件中定義它

[英]How do you declare a struct in a header file and define it in the .c file

我只需要一個簡單的直接答案,但我無法在線獲得任何答案。

為什么我在person.h文件中寫入以下內容時會出現錯誤:

typedef struct Person Person_T;

以下是person.c文件:

typedef struct Person
{
  char *name;
  unsigned int age;
} Person_T;

編輯:作為參考,這是我的main.c文件:

#include <stdio.h>
#include "person.h"

int main()
{
  Person_T sam = { "Sam", 24 };
  printf("%s, %d\n", sam.name, same.age);

  return 0;
}

錯誤是variable has incomplete type Person_T (aka 'struct Person')

還有兩個相關的問題:

  • 為什么有些人寫extern struct Person Person; 或類似的東西?
  • 我什么時候應該在 header 文件中定義我的結構和函數,或者更確切地說,在庫中定義 go 標頭?

對不起,我是新人。

在包含 person.h 的 main.c 文件中,類型struct Person已聲明但未定義。 因此,您不能在 main.c 中創建此類型的變量,盡管您可以創建指向它的指針。 在這種情況下, person.c 可以包含在struct Person上工作的函數並返回指向其中的指針,因此其他文件中的函數不需要知道細節。

如果希望這個文件和其他文件能夠使用struct Person的字段,則需要將 struct 的定義移動到 header 文件中。

在 header 文件中:

typedef struct Person Person_T;

在源文件中(沒有 typedef :):

struct Person {
    char *name;
    unsigned int age;
};

int main()
{
    Person_T sam = { "Sam", 24 };
    printf("%s, %d\n", sam.name, same.age);
    return 0;
}

現在,如果您想在 header 文件中聲明 function,那么您必須使用指向 Person_T 的指針,例如

int foo(Person_T *person);

我只是讓它工作。

我使用了@dbush 的建議。

在我的 header 文件中,我添加了與我的結構交互所需的所有功能:

typedef struct Person Person_T;

Person_T* create_person(char *name, unsigned int age);

char* get_name(Person_T *person);
unsigned int get_age(Person_T *person);

然后在我的.c文件中實現這些。

最后,我需要做的就是使用這些API與我的struct進行交互。 我覺得這是確保安全和優雅的最佳設計。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM