簡體   English   中英

typedef 結構:未知名稱

[英]typedef struct: unknown name

我對我的實際問題感到困惑......也可能是我的錯誤

帶有代碼的簡短描述:

rtc.h

#ifndef RTC_H_
#define RTC_H_

typedef struct timestamp_t
{
    uint8_t year,month,day,hour,minute,second;
}timestamp_t;

#endif /* RTC_H_ */

lpwa.h

#ifndef LPWA_H_
#define LPWA_H_

#include "rtc.h"

timestamp_t lpwa_ntp_to_stamp(char*); //shows error: unknown name timestamp_t

#endif /* LPWA_H_ */

lpwa.c

#include "lpwa.h"

timestamp_t lpwa_ntp_to_stamp(char *text) //no problem
{
    ...
}

如果我將 typedef 結構復制到 lpwa.h,它會顯示“timestamp_t 的沖突類型”

我錯過了什么或者這不可能嗎?

這是根據我的調試建議編譯的答案,它幫助 OP 找到實際問題:

  • 顯示的代碼不應出現所描述的問題。 這實際上是有用的信息,因為這意味着您的實際代碼的結構是不同的,您需要找到差異來追蹤問題的根源。
  • 問題可能在於包含順序,也就是包含樹,與您想象的不同。
  • 插入#error Header A is compiled #error Header B is compiled在項目的所有可能和不太可能的位置大量編譯,這將使您了解實際的包含樹,從而使您可以查找與想象中的包含樹的差異。 (如果你的編譯器支持,使用#warning ,那么你得到的不僅僅是遇到的第一個#error 。)
  • 調試它的建設性方法是制作一個 StackOverflow 風格的最小可重現示例。
  • 如果制作經典的 MRE/MCVE ( http://stackoverflow.com/help/mcve ) 看起來工作量太大(相信我不是這樣),那么請嘗試從頭開始制作您認為發生的事情的 MRE。 這至少會告訴你,你認為發生的事情並不是實際發生的事情。 這也是有用的信息,盡管使用它需要經驗和紀律。 (感謝您在這里沒有被嘲笑。)
  • 請記住,每個源代碼文件“*.c”都是另一個包含樹的根。
  • 使用#error還會提醒您查看與編譯器實際處理的文件不同的文件(例如在編輯器中)可能存在的問題。 (同樣,不是 mocking。對我來說,這種情況發生的頻率比我想承認的要多......)

以上是一般情況。

特別是在您的情況下,我懷疑在顯示的包含和顯示的 typedef 之間有一個隱藏/間接的#include "lwpa.h"在 rtc.h 中。 (我認為你證實了這一點。)

暫無
暫無

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

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