2014-04-19 43 views
-3

我試圖利用#define的程序中的代碼,類似這樣(simplyfied到骨頭)示例代碼:無法使用的#define傳遞給原型的值,無效的代碼

#define M 20 
#define N 10 

void foo(int *a) { 
    if (a == M) { printf("Hello!\n"); } 
    else if (a == N) { printf("Goodbye!\n"); } 
return; 
} 
int main(void) { 
    foo(M); 
    return(0); 
} 

當嘗試編譯,我得到以下錯誤的輸出:

main.cpp||In function ‘void foo(int*)’:| 
main.cpp|6|error: ISO C++ forbids comparison between pointer and integer [-fpermissive]| 
main.cpp|10|note: in expansion of macro ‘M’| 
main.cpp|7|error: ISO C++ forbids comparison between pointer and integer [-fpermissive]| 
main.cpp|11|note: in expansion of macro ‘N’| 
main.cpp||In function ‘int main()’:| 
main.cpp|15|error: invalid conversion from ‘int’ to ‘int*’ [-fpermissive]| 
main.cpp|9|error: initializing argument 1 of ‘void foo(int*)’ [-fpermissive]| 
||=== Build finished: 4 errors, 0 warnings (0 minutes, 0 seconds) ===| 

現在,很明顯事情是錯在這裏。此代碼的目的是指定一個可以傳遞給原型的整數值,而不必在編寫代碼時記住整數的值。該技術似乎通常與套接字關聯使用,其中AF_INET和AF_INET6表示兩個不同的整數值。這樣你就不必記住IPv6協議的價值,如果這是你想要的套接字的價值,你只需要指定AF_INET6即可。

問:我應該如何編寫此代碼才能使其工作?

+8

_現在,這裏顯然有些問題._:錯誤消息確實使它成爲_obvious_。 – devnull

+0

@devnull好吧,但通過指定&M而不是M不能解決任何問題。它只會讓事情變得更糟...... – SeagulFish

+0

爲什麼'a'甚至是一個指針? – Cornstalks

回答

2

foo是接受一個指針一個Int。不是一個int值。你的定義變成了一個整數文字。並將工作在任何地方的整數文字工作。

您無法獲取文字的地址。

嘗試:

無效美孚(INT A){

或實際創建一個整數變量,並通過它的地址爲foo,並在FOO解除引用回一個int:

int main (void) 
{ 

    int myVar = M; 
    foo(&myvar) 
} 

void foo (int *a) { 

    if (*a == M) { printf("Hello!\n"); } 
    else if (*a == N) { printf("Goodbye!\n"); } 
    return; 
} 
+0

好的,很好的答案。但在這種情況下: 如果原型的聲明已經'void foo(char * a){}' 那麼我可以使用'foo(「Hello!」);',儘管「Hello!不是一個字符串,而是一個字符串值。有什麼不同? – SeagulFish

+0

'「Hello」'在內部存儲爲'char *'類型,因此爲什麼'char * str =「Hello」;'起作用。 '20'在整數字面上,它不是一個點,它是一個值。它存儲爲'int'值,因此爲什麼'int a = 20;'起作用。 C字符串不是值,它們是'char'數組,'char'是一個值。 –

+0

@SeagulFish,不像C++ 11那樣,因爲它需要是const char * a',因爲字符串文字是const char [N]'。 – chris

0

你明白,預處理器是一個非常簡單的生物。

它只是用20代替任何M。不是指針。

所以改變

void foo(int *a) { 

void foo(int a) { 
0

錯誤消息說明了這一切。您正在比較指向整數值的指針,而您打算做的是比較存儲在指針aMN指向的位置的值。

相關問題