6

私は3つのファイルを持っています:

main.c

#include <stdio.h>
#include <stdlib.h>
#include "test.h"

#define DEBUG

int main()
{
  testFunction();
    return 0;
}

test.h

#ifndef TEST_H
#define TEST_H
#include <stdio.h>
#include <stdlib.h>

void testFunction();

#endif // TEST_H_INCLUDED

test.c

#include "test.h"

void testFunction(){
  #ifdef DEBUG
    printf("I'm inside the testFunction\n");
  #endif
}

質問:プログラムが#ifdef DEBUGブロックに何かを出力しないのはなぜですか? #define DEBUGを test.h または test.cに記述すれば、すべて問題ありません。main.c で#define DEBUGを実行すると何が問題になるのでしょうか? ありがとう。

4

5 に答える 5

13

プリプロセッサ ディレクティブの define と ifdef が思いどおりに機能しない

いいえ、そうではありません。プリプロセッサ ディレクティブがファイル境界を横断すると信じているようですが、そうではありません。d プリプロセッサ マクロのスコープは、#defineそれが定義されている単一のファイルのみ、または他のファイル#includeがマクロ定義を含むファイルである場合にのみ、他のファイルです。

おそらく、各ファイルに対してコンパイラ (およびプリプロセッサ) を個別に実行することを想像するのが役立つでしょう (気付いていなくても実行します)。プリプロセッサがDEBUG操作対象外のファイルで定義されていることを知る方法はありません。

于 2013-05-08T16:23:39.843 に答える
3

DEBUGにあるため#definemain.cでは表示されませんtest.c#defineビルド設定またはヘッダーでそれを行う必要があります

于 2013-05-08T16:22:45.413 に答える
2

DEBUG内部で定義しmain.cたがtest.c含まれていないmain.cため、翻訳単位のコンパイル中にプリプロセッサシンボルが存在しません。

ヘッダー ファイルでグローバル スコープ マクロを宣言し、必要な場所に含める必要があります。

于 2013-05-08T16:22:27.750 に答える
1

main.c で DEBUG を定義します -- これは test.c には表示されません -- DEBUG を main.c と test.c の両方に表示する場合は、test.h で定義する必要があります。

于 2013-05-08T16:22:22.953 に答える
0

グローバルな可視性のためにメイクファイル内に DEBUG マクロを定義する

于 2013-05-08T16:24:34.693 に答える