2009-11-11 127 views
76

之間的區別我在編譯我的程序,它將在linux gcc 4.4.1 C99上運行。#if defined(WIN32)和#ifdef(WIN32)

我只是把我的#defines分開,將在Windows或Linux上編譯的代碼。但是,我得到了這個錯誤。

error: macro names must be identifiers. 

使用此代碼

#ifdef(WIN32) 
/* Do windows stuff 
#elif(UNIX) 
/* Do linux stuff */ 
#endif 

然而,當我改變了這個錯誤是固定的:

#if defined(WIN32) 
/* Do windows stuff 
#elif(UNIX) 
/* Do linux stuff */ 
#endif 

我只是想知道,爲什麼我得到的錯誤,爲什麼#define語句是不同的?

非常感謝,

回答

112

如果使用#ifdef語法,請刪除括號。

這兩者之間的區別是,#ifdef只能使用單個條件,
#if defined(NAME)能做化合物條件句。

例如,在你的情況:無論是由該名稱的宏被定義

#if defined(WIN32) && !defined(UNIX) 
/* Do windows stuff */ 
#elif defined(UNIX) && !defined(WIN32) 
/* Do linux stuff */ 
#else 
/* Error, both can't be defined or undefined same time */ 
#endif 
+2

是的,但你也可以級聯的#ifdef UNIX與WIN32的#ifndef,並獲得相同的靈活性(而不是可讀的,我同意) – jpinto3912 2009-11-11 11:42:57

+1

@ jpinto3912但如果只有他們只是變得更加多毛用''|| – Aidiakapi 2016-01-05 18:18:51

+0

從頭開始'#if defined(NAME)'並避免創建'#ifdef'語句。 – Andy 2018-02-20 07:47:24

21

#ifdef檢查,#if評估爲真值的表達,並檢查

#define FOO 1 
#define BAR 0 

#ifdef FOO 
#ifdef BAR 
/* this will be compiled */ 
#endif 
#endif 

#if BAR 
/* this won't */ 
#endif 

#if FOO || BAR 
/* this will */ 
#endif 
+0

不知道爲什麼這會得到2個無法解釋的downvotes – artm 2017-02-24 01:55:08

+1

這並不回答這個問題。問題要求'#if defined'和'#ifdef'之間的區別。 – 2017-06-12 07:57:33

32
#ifdef FOO 

#if defined(FOO) 

是相同的,

,但同時做幾件事情,你可以用定義,像

#if defined(FOO) || defined(BAR) 
-8

嘗試用#else更換#elif,因爲我覺得#elif只伴隨着#if,而不是與#ifdef

+1

通知,這是不正確的 – IceFire 2016-03-05 12:27:07