#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が異なるのか疑問に思っていましたか?

どうもありがとう、

回答:


161

#ifdef構文を使用する場合は、角かっこを削除します。

2つの違いは、#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

2
@ jpinto3912しかし、これはさらに||
厄介です

彼らが#if defined(NAME)最初からやり遂げたばかりで、#ifdef声明の作成を避けていたとしたら。
アンディ

51
#ifdef FOO

そして

#if defined(FOO)

同じだ、

しかし、一度にいくつかのことを行うには、次のように定義済みを使用できます

#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
Hassan Nadeem 2017年

1
これは、#if FOOと#if defined(FOO)の動作が異なる方法の最も良い説明です。
Paul Beusterien
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.