C语言 #ifndef 引起的redefinition of xxx 问题解决
生活随笔
收集整理的這篇文章主要介紹了
C语言 #ifndef 引起的redefinition of xxx 问题解决
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
問題如下
多個.c和.h文件
其中cloth.h分布被hat.h和paths.h包含,編譯時出現如下問題:
error: redefinition of struct _Cloth
我的cloth.h定義如下:
#include <stdio.h>
#include <stdlib.h>
#include "retval.h"struct _Cloth;
typedef struct _Cloth Cloth;typedef Cloth* (*createClothFunc)();
typedef void (*deleteClothFunc)(Cloth* thiz);struct _Cloth
{createClothFunc createCloth;deleteClothFunc deleteCloth;
};
_Cloth 結構體先聲明,再定義,顯然滿足C語言的語法,那麼以上重復定義的異常來自那里呢?
問題解決
緊接著發現該問題是在編譯時檢測出來的,那麼分析一下編譯器在編譯C語言都做了一些什么呢?
-
預處理
-
編譯
-
匯編
-
鏈接
詳細講解可以參考C語言編譯過程
關于#ifndef 條件編譯 的作用如下
#ifndef x //先測試x是否被宏定義過
#define xcode 1 //如果x沒有被宏定義過,定義x,并編譯code 1#endifcode 2 //如果x已經定義過了則編譯程序段2的語句,“忽視”程序段1。
顯然其最主要的目的是為了防止頭文件 的重復包含和編譯。
到此,以上結構體重定義的問題就比較清晰了,cloth.h被重復包含,且因為cloth.h未指定條件編譯,被重復編譯了。此時編譯器會認為cloth.h中的結構體定義是被重復定義得。
在多文件的開發過程種,需要規范化頭文件的定義,增加條件編譯相關的代碼,防止頭文件被重復包含導致的編譯 異常。
總結
以上是生活随笔為你收集整理的C语言 #ifndef 引起的redefinition of xxx 问题解决的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 喋血复仇单人模式怎么玩?
- 下一篇: 网络故障排查命令