我正在讀這本書Head First C,我是關於可變參數的部分。在帶有可變參數的函數中傳遞「enum」時出錯
我寫了下面的代碼:
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
enum drink {
MUDSLIDE, FUZZY_NAVEL, MONKEY_GLAND, ZOMBIE
};
double price(enum drink d) {
switch(d) {
case MUDSLIDE:
return 6.79;
case FUZZY_NAVEL:
return 5.31;
case MONKEY_GLAND:
return 4.82;
case ZOMBIE:
return 5.89;
}
return 0;
}
double calc(int args, ...) {
double total = 0;
va_list ap;
va_start(ap, args);
int i;
for (i = 0; i < args; i++) {
int currentDrink = va_arg(ap, int);
total += price((drink) currentDrink);
}
va_end(ap);
return total;
}
int main() {
printf("Price is %.2f\n", calc(2, MONKEY_GLAND, MUDSLIDE));
return 0;
}
代碼編譯和完美的作品。
但是...我的解決方案有兩條不同的路線。
我:
int currentDrink = va_arg(ap, int);
total += price((drink) currentDrink);
書:
enum drink currentDrink = va_arg(ap, enum drink);
total += price(currentDrink);
我試圖用執行期間在書中提出的解決方案,但錯誤和報告警告:「飲料'在通過'...'時被提升爲'int'
本書在linux上使用gcc編譯器。我在Windows上使用gcc。
問題:我無法編譯本書中提出的代碼的原因是什麼?
編輯 配置錯誤。當時正在使用C++編譯器,正在考慮使用C. 但問題依然存在:爲什麼在C++中會導致執行中的警告和錯誤?
我不能複製你的問題。這本書的版本適合我。你使用的是什麼版本的gcc?運行'gcc --version'。 – ooga
請提供您的編譯器的版本信息。另外,爲了風格和簡單起見,請嘗試將此用於您的枚舉定義:'typedef enum drink {MUDSLIDE,FUZZY_NAVEL,MONKEY_GLAND,ZOMBIE } drink;'。這樣,你可以使用'drink'作爲一種類型,而不必輸入'enum drink'。 – DevNull
@ooga gcc(tdm-1)4.5.2 – Macabeus