[問題] 前置處理macro宣告與使用

看板C_and_CPP (C/C++)作者 (阿瑜)時間14年前 (2012/04/10 17:40), 編輯推噓4(4022)
留言26則, 4人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) mac os x10.6.8 xcode 4.2 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) lcms2 (little cms) 問題(Question): http://ideone.com/za4PY 這code是lcms2.h的一部份內容,有些地方看不太懂想請教一下。 Q1:想問一下為什麼code一開始還要用#ifndef _lcms2_H ? 會用到這code不就已經#include "lcms2.h"了嗎?用ifndef確認有什麼意義嗎? 還有就是我手邊的c++ plus primer裡面的範例是: //blooper.h #ifndef _BLOOPER_H_ ... header名稱的大小寫和h之後有沒有“_”有差嗎? Q2:為什麼他有些地方在#define CMSEXPORT 或CMSAPI的時候後面甚麼也沒加? 像22,23行,但在12行的時候就有:#define CMSAPI __declspec(dllexport) CMSEXPORT跟CMSAPI看起來不像header也不像Standard Predefined Macros 裡面的東西阿,難道define macro的時候可以完全不用給一個值或定義嗎? Q3:在code的26行之後是怎樣的宣告方式? 最後好像是一個完整的function,但前面的CMSAPI和CMSEXPORT完全不知道 在做什麼。 附上完整的code:http://trac.imagemagick.org/browser/lcms/trunk/include/lcms2.h 謝謝大家!!!! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 120.126.67.198

04/10 17:53, , 1F
Q1: 估狗include guard, “_”或字母大小寫不重要, 就
04/10 17:53, 1F

04/10 17:53, , 2F
只是一種編程style而已
04/10 17:53, 2F

04/10 17:54, , 3F
Q2: preprocesser除了當macro以外,可以用來控制在不同
04/10 17:54, 3F

04/10 17:55, , 4F
編譯條件下要編譯哪段code (利用#ifdef) 這種情況下只
04/10 17:55, 4F

04/10 17:55, , 5F
要有define就好,define成什麼不重要,故可省略
04/10 17:55, 5F

04/10 17:56, , 6F
Q3: 那是一種shared library的技巧
04/10 17:56, 6F

04/10 17:57, , 7F
詳情可以google shared library, dll, dllexport 等等
04/10 17:57, 7F

04/10 18:15, , 8F
底線是有區別的,請見 #1EjCxNm6
04/10 18:15, 8F

04/10 18:18, , 9F
感謝樓上指正!
04/10 18:18, 9F

04/10 19:54, , 10F
不好意思Q2我還是不太懂,在那段code中他用#ifdef確
04/10 19:54, 10F

04/10 19:55, , 11F
認編譯環境這我知道,但後來的#define CMSAPI
04/10 19:55, 11F

04/10 19:56, , 12F
有的有東西,有的卻沒有是為甚麼呢?
04/10 19:56, 12F

04/10 20:00, , 13F
如果在沒有#define _win32的環境不做任何事,就不要
04/10 20:00, 13F

04/10 20:01, , 14F
寫最後#else之後的#define CMSAPI就好了阿
04/10 20:01, 14F

04/10 20:41, , 15F
這個 CMSAPI 在某些情況會定義成某些東西
04/10 20:41, 15F

04/10 20:41, , 16F
在另一些情況我們希望它展開後會消失
04/10 20:41, 16F

04/10 20:41, , 17F
這時就會這樣子寫
04/10 20:41, 17F

04/10 20:42, , 18F
如此例在 26 行以後的定義有 CMSAPI 出現
04/10 20:42, 18F

04/10 20:42, , 19F
那若展開到只寫 #define CMSAPI 的那邊時
04/10 20:42, 19F

04/10 20:42, , 20F
展開後那個 CMSAPI 的部份會變成沒有東西
04/10 20:42, 20F

04/10 20:43, , 21F
而這裡的情境是在 Windows 下作有關 dll 的宣告
04/10 20:43, 21F

04/10 20:44, , 22F
因此在非 windows 的環境就讓它展開成空即可
04/10 20:44, 22F

04/10 21:37, , 23F
謝謝大家!!!我大概知道是甚麼意思了。 所以在26行
04/10 21:37, 23F

04/10 21:38, , 24F
的code,如果在xcode中會因為CMSAPI的定義是空的,
04/10 21:38, 24F

04/10 21:41, , 25F
編譯後只剩下後面的function,cmsstrcasecmp(); ?
04/10 21:41, 25F

04/10 21:49, , 26F
PS:#1EjCxNm6 是甚麼關鍵字==?
04/10 21:49, 26F
文章代碼(AID): #1FX00C_x (C_and_CPP)
文章代碼(AID): #1FX00C_x (C_and_CPP)