2

こんにちは、Cコードを理解するのに助けが必要です:

#if 0
   some C code 1
#elif 0
   static int8 arry[10];
#pragma Align_to(32, arry)
   ASSERT(((int8ptr_t)arry) & 15) == 0)
#else
   ASSERT(((int8ptr_t)arry) & 15) == 0)
#endif

私の質問:

  1. その部分だけ#elseコンパイルされていますか?

  2. #pragma Align_to(32, arry)とはどういう意味#elif 0ですか?

4

3 に答える 3

2

実際に答えるより良い方法は、コンパイラーに尋ねることです-使用g++ -EまたはMSVC:cl /EP実際にコンパイルされたものを出力します

于 2013-06-04T13:18:33.273 に答える
0

1 への回答: はい。ただし、#if 0etc 内の部分も有効な前処理トークンで構成されている必要があることに注意してください。これは、これが診断で失敗することを意味します。

#if 0
That's what C is all about
#endif

lone によって導入された未終了の文字定数があるため'です。終了していない文字列リテラルについても同様です。

2 への回答: これは、アドレスが 32 の倍数でアラインされるpragmaというコンパイラへのヒントです。arry

于 2013-06-04T13:22:41.497 に答える
0

はい、その#else部分はコンパイルされたものです。


この#pragmaディレクティブは、コンパイラ固有のディレクティブです。コンパイラが指定されていないので、それは何を意味する可能性があります。

あなたの場合#pragma Align_to(32, arry)、変数「arry」が32バイト境界のメモリに確実に配置されるようにコンパイラに指示する可能性があります。これは通常、パフォーマンス上の理由または互換性の問題のためです。__attribute__同様の変数属性を制御するためのキーワードの使用を調べることもできます。

于 2013-06-04T15:35:04.000 に答える