2014-05-13 115 views
2

這是我的C程序:爲什麼不能我創建了一個名爲POW()函數

#include<stdio.h> 
main() 
{ 
int a,b; 
int pow (int,int); 
printf("Enter the values of a and b"); 
scanf("%d %d",&a,&b); 
printf("Value of ab is %d",pow(a,b)); 
} 
pow(int c,int d) 
{ 
return c*d; 
} 

我並沒有包括在我的計劃math.h中。我正在使用gcc編譯器。我得到以下錯誤

ex22.c: In function `main':

ex22.c:6: error: conflicting types for `pow'

搜索後,我才知道math.h中有一個pow函數。但我不包括math.h,但仍然出現錯誤。怎麼樣 ?

+0

這看起來像一個gcc錯誤,這意味着有錯誤輸出中可能包含更多行。請編輯問題以包含*完整*錯誤日誌。 –

+1

嘗試'int pow(int c,int d)'而不是'pow(int c,int d)' –

+2

爲什麼要創建一個與庫函數同名的函數?這通常是一場災難。 –

回答

5

無論您是否包含該標準函數的標頭,您都不應該爲自己的函數使用標識符,該標識符也是C標準庫函數的名稱。除非該函數被聲明爲static,並且編譯器可以專門處理這些函數(例如在pow(x, 2)的情況下,通過發出x*x的代碼而不是函數調用),C標準明確禁止。

+0

,但反之亦然,我猜。如果我使用庫函數,並且如果我沒有包含相應的頭文件,我會得到錯誤rit? – samnaction

+0

@sameer然後你會得到一個不聲明函數的警告。 –

+2

quibble:該標準規定:「標準庫中的所有帶外部鏈接的標識符始終保留用作外部鏈接的標識符。」和「標準庫中的文件範圍的每個標識符被保留用作宏名稱,並且如果包括它的任何相關頭文件,則其作爲具有文件範圍的標識符在同一名稱空間中」。這似乎意味着,如果'pow'被聲明爲'static',所有的都會很好,因爲'math.h'不包括在內。另外,如果你指定'-fno-builtin-pow',gcc也可以。 – rici

0

這一個工作,但有警告:

warning: incompatible redeclaration of library function 'pow' [-Wincompatible-library-redeclaration] int pow (int,int); ^ test.c:3:5: note: 'pow' is a builtin with type 'double (double, double)'

#include<stdio.h> 

int pow (int,int); 

int main(void) { 
    int a,b; 
    printf("Enter the values of a and b"); 
    scanf("%d %d",&a,&b); 
    printf("Value of ab is %d", pow(a,b)); 
} 

int pow(int c,int d) 
{ 
    return c*d; 
} 
0

試試這個:沒有警告,但瘋狂的編程

#define pow stupidpow 
#include<stdio.h> 

int main(void) { 
    int a,b; 
    printf("Enter the values of a and b\n"); 
    scanf("%d %d",&a,&b); 
    printf("Value of ab is %d", pow(a,b)); 
} 

int pow(int c,int d) 
{ 
    // count c^d 
    printf("\nAns is \n"); 
} 
相關問題