提问人:ant2009 提问时间:11/11/2009 最后编辑:desertnautant2009 更新时间:8/27/2023 访问量:136607
#if 定义 (WIN32) 和 #ifdef 定义 (WIN32) 之间的区别
difference between #if defined(WIN32) and #ifdef(WIN32)
问:
我正在编译将在 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
答:
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
评论