根據傳遞給可變參數功能this answer數字常量,如果他們以一個總是被視爲int
。這讓我想知道爲什麼下面的代碼同時適用於int
和long long
。考慮下面的函數調用:爲什麼我的可變參數函數同時適用於int和long long?
testfunc(4, 1000, 1001, 1002, 1003);
testfunc
看起來是這樣的:
void testfunc(int n, ...)
{
int k;
va_list marker;
va_start(marker, n);
for(k = 0; k < n; k++) {
int x = va_arg(marker, int);
printf("%d\n", x);
}
va_end(marker);
}
這工作得很好。它打印1000,1001,1002,1003。但令我驚訝的是,下面的代碼也適用:
void testfunc(int n, ...)
{
int k;
va_list marker;
va_start(marker, n);
for(k = 0; k < n; k++) {
long long x = va_arg(marker, long long);
printf("%lld\n", x);
}
va_end(marker);
}
這是爲什麼?爲什麼它也可以與long long
一起使用?我認爲如果數字整型常量適合於一個,則它們被傳遞爲int
? (參見上面的鏈接)那麼它怎麼能和long long
一起工作呢?
哎呀,在int
和long long
之間交替時,它甚至可以工作。這讓我很困惑:
void testfunc(int n, ...)
{
int k;
va_list marker;
va_start(marker, n);
for(k = 0; k < n; k++) {
if(k & 1) {
long long x = va_arg(marker, long long);
printf("B: %lld\n", x);
} else {
int x = va_arg(marker, int);
printf("A: %d\n", x);
}
}
va_end(marker);
}
這怎麼可能?我認爲是int
我的所有參數都過去了......爲什麼我隨意,沒有麻煩來回切換int
和long long
之間呢?我真的很困惑,現在...
感謝任何輕灑在這!
你使用什麼芯片?什麼是ABI(應用程序二進制接口)?您可能會因爲使用64位計算機而失控,並且可變參數的前N個參數將傳遞到64位寄存器的寄存器中,這些寄存器足夠長以用於「long long」。嘗試用20個參數或32個以上的參數調用該函數。這個想法是,如果有太多的參數適合在寄存器中,那麼額外的數據將作爲'int'傳遞到堆棧上。 –
我在使用gcc的64位Ubuntu上。 – Andreas
未定義的行爲包括偶然工作的行爲。它肯定會在64位英特爾處理器上實現,ABI需要每個參數8個字節,而高32位將始終爲零,處理器爲小端。修補任何這些意外的財產,你會發生事故。 –