#if defined(WIN32)和#ifdef(WIN32)之间的区别


116

我正在编译将在linux gcc 4.4.1 C99上运行的程序。

我只是在输入#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

我只是想知道为什么会收到该错误,为什么#defines不同?

非常感谢,

Answers:


161

如果使用#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与#ifndef WIN32级联,并获得相同的灵活性(不可读,我同意)
jpinto3912,2009年

2
@ jpinto3912但这变得更加||
棘手

如果仅仅是他们#if defined(NAME)从一开始就同​​意并避免创建一个#ifdef声明。
安迪

51
#ifdef FOO

#if defined(FOO)

是相同的,

但是要一次完成几件事,您可以使用define

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

28

#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

13
这不能回答问题。这个问题问的差异#if defined#ifdef
哈桑·纳德姆

1
这是有关#if FOO和#if defined(FOO)如何表现不同的最佳解释。
Paul Beusterien
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.