我想重新編譯一個用GCC編寫的C++項目來鏗鏘聲,它給了我一些可變參數方法的問題。C++&可變參數與不同的編譯器
NB:該項目也應編與非C++ - 11級標準的編譯器,所以我不能在這裏使用花哨的C++ 11語法..
GCC接受無警告下面的代碼(1):
void Set(TreeIter &it, ...) {
va_list va;
va_start(va, it);
gtk_list_store_set_valist(*this, const_cast<TreeIter *>(&it), va);
va_end(va);
}
和(2):
void AddTail(...) {
TreeIter it;
gtk_list_store_append(*this, &it);
va_list va;
va_start(va, this);
gtk_list_store_set_valist(*this, &it, va);
va_end(va);
}
雖然CLANG發射兩個警告:
(1):
./ootree.h:444:30: warning: 'va_start' has undefined behavior with reference types [-Wvarargs]
(2):
./ootree.h:476:30: warning: second parameter of 'va_start' not last named argument [-Wvarargs]
我可以很容易地修復(1)通過用副本替換TreeIter引用(和標準似乎需要我做所以),但我沒有找到一個簡單的方法來解決(2),這是一個最小的獨立示例,顯示行爲,這個程序不僅適用於gcc,還適用於clang,但這些警告非常嚇人。
#include <stdio.h>
#include <stdarg.h>
struct T {
void print(...) {
va_list va;
va_start(va, this);
vprintf("%d %d %d\n", va);
va_end(va);
}
};
int main() {
T().print(2, 4, 6);
}
Clang是對的。請參閱[support.runtime]/3。 –