2009-11-11 378 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