2015-04-05 62 views
0

我寫一個簡單的程序後按預期改變除了乘法的#define不工作和#undef使用的#ifndef

#include<stdio.h> 

#define ADD(X,Y) X+Y 

void fun() 
{ 
    #ifndef ADD(X,Y) 
     printf("entered #ifndef"); 
     #define ADD(X,Y) X*Y; 
    #endif 

    int y=ADD(3,2); 
    printf("%d",y); 
} 

int main() 
{ 
    #undef ADD(X,Y) 
    fun(); 

    return 0; 
} 

我期望的輸出是3*2但代碼仍然輸出3+2即5。
代碼不輸出:"entered #ifndef",那意味着#undef不起作用? 這裏有什麼問題?

編輯: 由於@deviantfan

下面是正確的代碼:

#include<stdio.h> 

#define ADD(X,Y) X+Y 

void fun(); 

int main() 
{ 
    #undef ADD(X,Y) 
    fun(); 

    return 0; 
} 

void fun() 
{ 
    #ifndef ADD(X,Y) 
     printf("entered #ifndef"); 
     #define ADD(X,Y) X*Y; 
    #endif 

    int y=ADD(3,2); 
    printf("%d",y); 
} 
+0

*警告:額外的令牌在的#ifndef指令結束[-Wextra的令牌] * – chris 2015-04-05 19:08:26

+0

'#undef'什麼也不做在這裏。預處理指令在代碼中進行處理,如果它們位於函數內部,則爲regargless(在您的情況下爲'fun()')。 – myaut 2015-04-05 19:09:40

回答

3

預處理器(其處理如#define)doesn't瞭解
功能或類似的東西。它嚴格地從上到下處理文件,獨立於實際代碼執行在運行時如何跳轉。

只要它碰到您的#undef#ifndef很久以前就被遺忘了,不會再被評估。

1

#ifdef,#ifndef#undef預處理器指令需要標識符而不是表達式。

#ifndef ADD(X,Y)是沒有意義的。

它應該是:#ifdef ADD

同樣爲#undef ADD

2

這個問題的實際解決方案是使用函數指針。

這是從您當前的代碼直接轉換爲函數指針。

請注意相似性和差異。

#include <stdio.h> 

int actual_add(int X, int Y) { 
    return X+Y; 
} 

int actual_multiply(int X, int Y) { 
    return X*Y; 
} 

int (*ADD)(int,int) = actual_add; 

void fun() 
{ 
    if (!ADD) 
    { 
     printf("entered #ifndef"); 
     ADD = actual_multiply; 
    } 

    int y=ADD(3,2); 
    printf("%d",y); 
} 

int main() 
{ 
    ADD = NULL; 
    fun(); 

    return 0; 
}