我試圖利用#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即可。
問:我應該如何編寫此代碼才能使其工作?
_現在,這裏顯然有些問題._:錯誤消息確實使它成爲_obvious_。 – devnull
@devnull好吧,但通過指定&M而不是M不能解決任何問題。它只會讓事情變得更糟...... – SeagulFish
爲什麼'a'甚至是一個指針? – Cornstalks