- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
为什么会这样?该代码适用于 Linux 上的 GCC 4.7 和 Windows 上的 MSVC++ 2010,并且不会生成警告。然而,在 ideone.com 上它 crashes使用 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"));
}
最佳答案
我在 GCC 4.4.6 中遇到错误:
test.cpp: In function ‘void print(int, ...)’:
test.cpp:59: warning: cannot receive objects of non-POD type ‘struct mt’ through ‘...’; call will abort at runtime
test.cpp: In function ‘int main()’:
test.cpp:83: warning: cannot pass objects of non-POD type ‘struct mt’ through ‘...’; call will abort at runtime
test.cpp:83: warning: cannot pass objects of non-POD type ‘struct mt’ through ‘...’; call will abort at runtime
test.cpp:83: warning: cannot pass objects of non-POD type ‘struct mt’ through ‘...’; call will abort at runtime
test.cpp:83: warning: cannot pass objects of non-POD type ‘struct mt’ through ‘...’; call will abort at runtime
$ g++ --version
g++ (GCC) 4.4.6 20110731 (Red Hat 4.4.6-3)
您不能通过可变参数函数参数传递 struct
,而是传递指针:
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()
{
mt mt1(2);
mt mt2(4.2);
mt mt3('a');
mt mt4("Hello");
print(4, &mt1, &mt2, &mt3, &mt4);
}
这在我的系统上运行良好:
$ ./a.out
2
4.2
a
Hello
关于c++ - 为什么此 C++ 代码会在 ideone.com 上出现 SIGILL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11326459/
有人可以告诉我为什么会发生这种情况吗?这里出了什么问题: 我必须打印字符串的一部分,其中要打印的字符串的起始位置和长度在输入中给出。 问题:当我在 devC++ 中运行它时,一切都运行良好并且输出正常
这段代码有问题http://www.spoj.com/problems/BASE/它在 windows 和 linux 上运行良好,但是当我在 ideone 上运行它时,它没有显示任何输出。谁能告诉我
/* package whatever; // don't place package name! */ import java.util.*; import java.lang.*; import
我正在用 C 语言编写一个程序,用于查找两个排序数组的交集。当我在我的机器上使用 GCC 编译并运行该代码时,该代码工作正常,但在 ideone.com 上出现运行时错误。 这是Live link到下
我的程序有什么问题?它在我的 PC 上运行良好,但在 IDEone 中它提供了正确的输出,但显示运行时错误。请帮忙。 #include using namespace std; struct stud
好吧,我在 Ideone 上搞砸了并意外提交了这段代码,但令我惊讶的是它实际上编译并运行输出值 0,here . #include using namespace std; const int fi
我写了下面的代码: #include using namespace std; int main() { int v() return 0; } 我在 ideone 中运行了它,编译
我为我的家庭作业创建了一个程序,我尝试在 ideone.com 上测试它,但我得到一个错误: Exception in thread "main" java.lang.NullPointerExcep
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
我最近试图在 ideone.com 中运行这段代码... #include #include using namespace std; int getVal(string name) {
请你告诉我我做错了什么。我认为我的代码工作正常,但未通过 Ideone 测试。 do{ linia = reading.nextLine(); try{ number
考虑下面的程序: #pragma startup foo1 #pragma exit foo2 void foo1() { printf("Called before main\n"); }
import java.util.Scanner; public class Admit { // the main method has minimal dialogue and just
我正在使用 ideone 作为在线 c++ 编译器。当我保存一个代码时,ideone 给出了一个随机名称,例如 lnzr40 稍后可能会造成混淆(当我想打开特定代码时)。我想在编写/保存代码时更改该名
我正在尝试远程指导我办公室的几个人使用 Python,最简单的方法似乎是向他们展示这些简单的 Python 示例如何...... http://wiki.python.org/moin/SimpleP
我正在尝试通过比较 Visual Studio 的输出与 GCC 的输出来调试我在 Visual Studio 中遇到的问题,但我似乎无法获得要在 Ideone 中编译的极其简化的代码版本: #inc
我想建立自己的在线编译器。我想为此使用 Ideone Api。但其 api 以 WSDL 格式提供。我非常努力地尝试,但可以找到任何关于如何从 WSDL 中提取数据的教程。请告诉一些使用 Ideone
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
我正在尝试编写一个程序,该程序接受语法不正确的文本(长度低于 990 个字符)作为输入,对其进行更正,然后返回更正后的文本作为输出。我尝试使用在线编译器“ideone”运行该程序,但它返回了很多我不太
以下代码计算输入整数的阶乘。我在 Codeblocks 中运行了 2 个测试用例 - 9 和 2,并得到了正确的输出。对于相同的输入,ideone 将 2 的阶乘输出为 6,但它正确输出 9 的阶乘。
我是一名优秀的程序员,十分优秀!