[問題] 跨檔案 #define 的一個小問題

看板C_and_CPP (C/C++)作者 (Lego)時間11年前 (2014/07/24 01:34), 11年前編輯推噓2(2016)
留言18則, 5人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) GCC 如題 node.h node.c -- -- #include "node.h" #define DATATYPE char DATATYPE data; node* getnode() { struct nodetype { ... DATATYPE info; ... struct nodetype *next; } } void freenode(node* pn) { ... node* getnode(); ... void freenode(node*); } ... ... //EOF //EOF ============================================================================ queue.h queue.c -- -- #include "node.h" #include "queue.h" ... DATATYPE remove() { ... DATATYPE remove(); ... } ... //EOF //EOF -- 我想用linklist實現queue 因為我這次使用想放的資料是char 但是之後可能會希望他是int 這時我只要把DATATYPE char改成int 即可 所以我才會想這樣寫 之後要呼叫的時候在有main() 只#include "queue.h" 就能只用queue了 但是問題來了 就我這樣include下來 在"queue.c"裡無法知道DATATYPE到底是何方神聖 所以 DATATYPE remove() 會有 error 我想到的 法一 : 在queue.c 多一行#define DATATYPE char 但是我之後要改就要多改一個地方 法二 : 在queue.c 再#include "node.h" 一次 但是queue.h include一次 再include一次好像哪裡怪怪的 還有其他比較好的方法嗎? 小弟不才 希望大大能幫我解惑 <(_ _)> -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 125.230.84.78 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1406136877.A.36E.html

07/24 01:57, , 1F
#ifndef #define
07/24 01:57, 1F

07/24 01:59, , 2F
keyword : Include Guard <==查一下這個關鍵字
07/24 01:59, 2F

07/24 01:59, , 3F
另外別學壞用#pragma once, 這個M$ only 別用這個
07/24 01:59, 3F

07/24 02:00, , 4F
....剛查了一下 GCC跟clang居然支援了 真詭異
07/24 02:00, 4F

07/24 02:20, , 5F
queue.c includes queue.h, which includes node.h 怎麼會
07/24 02:20, 5F

07/24 02:21, , 6F
看不到 DATATYPE 呢? 除非有奇怪的 preprocessor directives
07/24 02:21, 6F

07/24 02:23, , 7F
不然 #include 只是單純的內文展開, 多重 include 會統統拉到
07/24 02:23, 7F

07/24 02:23, , 8F
最上層
07/24 02:23, 8F

07/24 02:38, , 9F
誒,我發現我誤解元po的問題了,請跳過我 XD
07/24 02:38, 9F

07/24 09:53, , 10F
#pragma once應該是各大編譯器都有支援了
07/24 09:53, 10F

07/24 09:54, , 11F
而且效率似乎比較好 所以也有人是建議使用
07/24 09:54, 11F

07/24 10:10, , 12F
once沒進標準是因為"同個檔案"在某些平台難以定義
07/24 10:10, 12F

07/24 10:12, , 13F
inclusion guard若編譯器有作特別處理效率其實差不多
07/24 10:12, 13F

07/24 11:23, , 14F
其實gcc -E出來應該結果都一樣...會有效能差嘛
07/24 11:23, 14F

07/24 11:23, , 15F
別告訴我gcc expand macros會多花幾個毫秒... XD
07/24 11:23, 15F

07/24 11:27, , 16F
once可以連開檔都省略掉 檔案夠多會差一點點XD
07/24 11:27, 16F
其實我是gcc+emacs Elipse-cdt 都有用 ((但是Eclpise 是用gcc吧? 我寫這個是在Eclipse-cdt下 然後在queue.c會有Syntax error. 不給Complier 所以如果我不用Eclipse 直接gcc那些檔案會過嗎? 現在電腦不在身邊沒法測試 ※ 編輯: qas612820704 (125.230.84.78), 07/25/2014 00:45:30

07/25 03:59, , 17F
不管是 Eclipse 還是去 command line 用 gcc, 出錯想找問題
07/25 03:59, 17F

07/25 04:00, , 18F
一定得看錯誤訊息. 真的是DATATYPE的問題嗎? 還是哪裡少分號?
07/25 04:00, 18F
= =!!問題還真的不是出在DATATYPEGP身上 對不起我犯傻了 結果還真的是有地方少分號... 不過但是套出些關鍵字學到些東西 謝謝! ※ 編輯: qas612820704 (140.120.19.2), 07/25/2014 12:43:35
文章代碼(AID): #1Jp_8jDk (C_and_CPP)
文章代碼(AID): #1Jp_8jDk (C_and_CPP)