日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

C语言 #ifndef 引起的redefinition of xxx 问题解决

發布時間:2023/11/27 生活经验 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言 #ifndef 引起的redefinition of xxx 问题解决 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

問題如下

多個.c和.h文件

其中cloth.h分布被hat.hpaths.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語言都做了一些什么呢?

  1. 預處理

  2. 編譯

  3. 匯編

  4. 鏈接

詳細講解可以參考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 问题解决的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。