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

difference between #if defined(WIN32) and #ifdef(WIN32)

提问人:ant2009 提问时间:11/11/2009 最后编辑:desertnautant2009 更新时间:8/27/2023 访问量:136607

问:

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

我只是把我的代码分开,这些代码将在 Windows 或 Linux 上编译。但是,我收到了这个错误。#defines

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

c

评论


答:

258赞 user44556 11/11/2009 #1

如果使用 #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赞 jpinto3912 11/11/2009
是的,但您也可以将 #ifdef UNIX 与 #ifndef WIN32 级联,并获得相同的灵活性(我同意,可读性不高)
3赞 Aidiakapi 1/6/2016
@jpinto3912 但随着||
2赞 Andy 2/20/2018
要是他们从一开始就顺其自然,避免创建声明就好了。#if defined(NAME)#ifdef
0赞 vesperto 5/23/2022
Sourceforge 对预定义的编译器宏有很好的参考
36赞 johannes 11/11/2009 #2

#ifdef检查是否已定义该名称的宏,计算表达式并检查是否为 true 值#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

评论

27赞 Hassan 6/12/2017
这并不能回答这个问题。该问题询问 和 之间的区别。#if defined#ifdef
3赞 Paul Beusterien 10/1/2019
这是对 FOO 和 #if 定义 (FOO) 如何表现不同的 #if 最好解释。
2赞 daparic 7/17/2021
一个有用的答案,因为它显示了 和 之间的微妙区别#ifdef#if
73赞 neha 10/20/2012 #3
#ifdef FOO

#if defined(FOO)

都是一样的,

但是要同时做几件事,你可以使用 defined,比如

#if defined(FOO) || defined(BAR)
0赞 Aykhan Hagverdili 8/27/2023 #4

使用 C23,您可以使用和:#elifdef#elifndef

#ifdef WIN32
/* Do windows stuff */
#elifdef UNIX
/* Do linux stuff */
#endif