5
爲什麼會發生?該代碼的工作原理並不會在Linux上的GCC 4.7和Windows上的MSVC++ 2010中生成警告。然而,在ideone.com上crashes與SIGILL
。這裏涉及到未定義的行爲?爲什麼這個C++代碼在ideone.com上得到SIGILL?
#include <iostream>
#include <cstdarg>
using namespace std;
enum types
{
INT,
DOUBLE,
CHAR,
STRING
};
struct mt
{
types type;
union
{
int i;
double d;
char c;
const char *s;
} val;
mt(int i)
: type(INT)
{
val.i = i;
}
mt(double d)
: type(DOUBLE)
{
val.d = d;
}
mt(char c)
: type(CHAR)
{
val.c = c;
}
mt(const char *s)
: type(STRING)
{
val.s = s;
}
};
void print(int n, ...)
{
va_list ap;
va_start(ap, n);
for (int i = 0; i < n; i++)
{
mt x(va_arg(ap, mt));
switch (x.type)
{
case INT:
cout << x.val.i << endl;
break;
case DOUBLE:
cout << x.val.d << endl;
break;
case CHAR:
cout << x.val.c << endl;
break;
case STRING:
cout << x.val.s << endl;
break;
}
}
va_end(ap);
}
int main()
{
print(4, mt(2), mt(4.2), mt('a'), mt("Hello"));
}
我以爲可以傳遞任何POD(參見C++ 03,5.2.2.7,「_ or class type_」)。因爲(a)它沒有非POD成員,(b)它沒有用戶定義的複製賦值操作符,(c)它沒有用戶定義的析構函數(見第9章)。這個演繹是否錯誤? –
@AndreyVihrov Varargs是一種黑客攻擊手段,並且不可移植(正如你發現的那樣)。使用'std ::'或其他集合類在方法之間傳遞對象。 –
trojanfoe
我不同意。可變參數是可移植的,因爲它們是C和C++標準的正式組成部分:-) –