2017-08-06 91 views
1

我與#define聲明函數是在主使用之前,但我仍然得到:功能fakultet的爲什麼在main中隱式聲明函數? C編程

隱含的聲明...

答案應該是6 ...

#include <stdio.h> 

#define fakultet(x) ((x)>1?((x)*(fakultet(x-1))):(1)) 

int main(void) { 
    printf(fakultet(3)); 
} 
+3

宏不遞歸擴展。 – BLUEPIXY

+2

另外'printf(fakultet(3));' - >'printf(「%d \ n」,fakultet(3));' – BLUEPIXY

+1

不使用宏作爲函數。 –

回答

6

我聲明功能與#define

你實際上是宣告一個宏,不是C函數:

#define fakultet(x) ((x)>1?((x)*(fakultet(x-1))):(1)) 

宏都只有一次擴大。因此,當你在代碼中使用fakultet

printf(fakultet(3)); 

被擴展爲:

printf(((3)>1?((3)*(fakultet(3-1))):(1))); 

和編譯器沒有找到一個名爲fakultet() C函數。因此,您可以:功能fakultet的

隱含的聲明...

+0

非常感謝你! – Happy