5
왜 이런 일이 발생합니까? 이 코드는 Linux의 경우 GCC 4.7, Windows의 경우 MSVC++ 2010에서는 경고없이 작동합니다. 그러나 ideone.com에서는 crashes과 SIGILL
이 있습니다. 정의되지 않은 동작이 여기에 관련되어 있습니까?ideone.com에서이 C++ 코드가 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_"참조)를 전달할 수 있다고 생각했습니다. 그리고'struct mt'는 POD를 보입니다. 왜냐하면 (a) non-POD 멤버가 없기 때문입니다. (b) 사용자 정의 복사 할당 연산자가 없기 때문에 (c) 사용자가 없습니다. 정의 된 소멸자 (9 절 참조). 이 공제가 잘못 되었습니까? –
@AndreyVihrov Varargs는 해킹의 일종이며 당신이 알아 낸 바와 같이 이식성이 없습니다. 메소드간에 객체를 전달하려면'std ::'또는 다른 콜렉션 클래스를 사용하십시오. –
trojanfoe
나는 동의하지 않는다. Varargs는 공식적으로 C와 C++ 표준 모두에 포함되어 있기 때문에 이식성이 뛰어납니다 .-) –