2013-05-08 48 views
1

我有3個文件:預處理器指令define和ifdef不按我想象的那樣工作?

的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 block?如果我在test.h或test.c中寫入#define DEBUG一切都很好。那麼問題是什麼#define DEBUG在main.c中?謝謝。

回答

7

預處理器指令define和ifdef不工作,因爲我想象?

不,不是。您似乎相信預處理器指令會遍歷文件邊界,而他們不會。 d預處理器宏的範圍僅爲它在其中定義的單個文件,或其他文件,僅當其他文件包含宏定義的文件時#include

也許這會幫助你想象一下,在每個文件上分別運行編譯器(以及預處理器)(即使你沒有意識到,你也可以這樣做)。預處理器無法告訴DEBUG已經在一個文件中被定義了,它並不在其上運行。

+0

downvote的原因是什麼? – 2013-05-08 16:56:24

1

您在main.c中定義了DEBUG - test.c不可見 - 如果您希望DEBUG對main.c和test.c都可見,您應該在test.h中定義它

1

由於您在main.c中定義了DEBUG,但test.c不包含main.c,所以在編譯轉換單元時,預處理器符號不存在。

您應該在頭文件中聲明全局作用域宏,然後將其包含在需要的地方。

2

因爲DEBUG#define'd在main.c中,所以在test.c中不可見。您需要#define它在構建設置,或在標題

-1

在makefile中爲DEBUG宏定義全局可見性

+1

這沒有幫助。該定義仍然只會影響main.c.你不能以你所建議的方式有效地重寫test.h – simonc 2013-05-08 16:26:03