undefの違いを理解し、マクロを0と定義したいと思っています。ありがとう。undefの違いは何ですか?<MACRO>は0ですか?
2
A
答えて
7
#define MACRO 0
はMACRO
トークンプリプロセッサはリテラル0
#undef MACRO
であることを定義し、それは存在しなかったかのようにだようにトークンプリプロセッサの定義MACRO
を削除します。例えば
:それらの
#define MACRO 0
#if defined (MACRO)
// we get here
#endif
#if (MACRO)
// we don't get here
#endif
#undef MACRO
#if defined (MACRO)
// we don't get here
#endif
1
一つは、特定の状況において、マクロ識別子の出現は、プリプロセッサによって0に置き換えられるようにマクロを定義します。もう1つはマクロの定義を削除し、識別子が同じコンテキストで見つかった場合にプリプロセッサで何も置き換えられず、そのままにします。この中
#define MACRO 0
int main()
{
return MACRO;
}
:たとえば
、プリプロセッサはこのターン
int main()
{
return 0;
}
をしかし、それはこのターンになります。これに
#define MACRO 0
#undef MACRO
int main()
{
return MACRO;
}
:
int main()
{
return MACRO;
}
を
2番目の例では、Cコンパイラは識別子MACRO
に遭遇し、おそらく宣言されていないというエラーが発生し、コンパイルが失敗する可能性があります。シンボルが定義されない最初の場合に
1
(MACROの#ifdef「が入る」ではないだろう)、第二のケースでは、「0」
3
を0として定義されたマクロがまだ定義されているように定義されたマクロを有しています。
#define VAL 0
#ifdef VAL
// VAL is defined so this part will be entered
printf("%d", VAL); // <- prints "0"
#endif
#undef VAL
#ifdef VAL
// Val is now undefined, this part will not be entered
#endif
2
違いは、 "未定義"は "0"と同じではありません(用途によって異なる)。
ブール値のコンテキストで使用されます。 #if MY_MACRO
の場合、違いはありません(未定義はfalse
に変換されるため)。
あなたが定義するいくつかのマクロをチェックしかし、一度、違いがあります:一般的に
// this macro is defined but empty.
// #ifdef MY_MACRO would evaluate to true/be included
// #if MY_MACRO would evaluate to false/not be included
// occurances would be deleted, e.g. 'something = MY_MACRO;' would be changed to 'something = ;'
#define MY_MACRO
// this macro is defined and set to 0.
// #ifdef MY_MACRO would evaluate to true/be included
// #if MY_MACRO would evaluate to false/not be included
// occurances would be replaced, e.g. 'something = MY_MACRO;' would be changed to 'something = 0;'
#define MY_MACRO 0
// this macro is undefined (after these lines)
// #ifdef MY_MACRO would evaluate to false/not be included
// #if MY_MACRO would evaluate to false/not be included
// occurances would remain unchanged (as the macro isn't defined anymore), e.g. 'something = MY_MACRO;' would be kept as 'something = MY_MACRO;'
#define MY_MACRO Hello!
#undef MY_MACRO
は: #define
は常に何らかの値を代入して定義されたマクロを作ります。たとえ新しい値が "空"であっても。 #undef
はマクロ定義を常に削除して未定義にします。発生はもはや置き換えられません。
関連する問題
- 1. Rubyの "undef"オブジェクトとは何ですか?
- 2. 1 << 0とは何ですか?
- 3. sys.exit(0)とos._exitの違いは何ですか(0)
- 4. (char)0と '\ 0'の違いは何ですか? C内
- 5. ASP.NET MVCで "<%="、 "<%:" "<%#"の違いは何ですか?
- 6. aspxの<%:と<%=と<%#の違いは何ですか?
- 7. Cの<と<<の違いは何ですか?
- 8. JavaでThread.yield()とThread.sleep(0)の違いは何ですか?
- 9. C言語でのptr = my_arrayとptr =&my_array [0] [0]の違いは何ですか?
- 10. このコードでrem == 0とrem = 0の違いは何ですか?
- 11. regexp \ k <name+0>の "+0"の意味は何ですか?
- 12. ejabberdのMAMプロトコルの0と1の違いは何ですか?
- 13. ASP.NET MVCの<%#と<%=の違いは何ですか?
- 14. Goの[0]と[:1]の違いは何ですか?
- 15. mySQL/SQLのcount(0)、count(1)..、count(*)の違いは何ですか?
- 16. angularJs 1.5では、@と<の違いは何ですか?
- 17. =、< - 、<=、haskellの違いは何ですか?
- 18. Task <>とIAsyncOperation <>の違いは何ですか
- 19. <f:viewParam>と<f:param>の違いは何ですか?
- 20. <<と+ =の違いは何ですか?
- 21. ArrayList <?>、ArrayList、ArrayList <Object>の違いは何ですか?
- 22. NHibernate Query <>とQueryOver <>の違いは何ですか?
- 23. <tiles:add>と<tiles:put>ストラットの違いは何ですか?
- 24. <?の違いは何ですか?エコー __();と<= __();
- 25. <?php ?>と<? ?>の違いは何ですか?
- 26. <TargetFramework>と<RuntimeFrameworkVersion>の違いは何ですか?
- 27. <chrono>と<ctime>の違いは何ですか?
- 28. list [-1:] [0]とlist [len(list)-1]の違いは何ですか?
- 29. setVisibility(View.INVISIBLE)の違いは何ですか? setVisibility(0);
- 30. "kill -0"と "kill -9"の違いは何ですか?
もう一つの例として、 '#undef MACRO'の直後の' #define MACRO 1'はOKですが、 '#define MACRO 0'の直後の' #define MACRO 1'はOKではありません。 –