Tag: gcc

c中使用三元运算符的错误

我在C中有一段代码如下: main() { int a=10, b; a>=5 ? b=100 : b=200 ; printf(“%d” , b); } 在unix中运行gcc编译器上的代码会将编译时错误生成为’赋值左值所需的左值’,并将错误指向b = 200,而在使用Turbo C编译的窗口中,将200作为输出。 请问有谁可以解释一下这种情况究竟发生了什么?

Bitshift和整数推广?

通常,C要求将二元运算符的操作数提升为更高级别操作数的类型。 这可以被利用来避免用详细的强制转换来填充代码,例如: if (x-48U<10) … y = x+0ULL << 40; 等等 但是,我发现,至少对于gcc,这种行为不适用于位移。 即 int x = 1; unsigned long long y = x << 32ULL; 我希望右手操作数的类型能够将左手操作数提升为unsigned long long以便移位成功。 但相反,gcc会打印一个警告: warning: left shift count >= width of type gcc是否被破坏,或者标准是否对比特提升的类型提升规则有所例外?

void时指针算法未知大小

在Visual Studio C ++版本9(也可能是其他版本)中,代码如下: int a = sizeof(void); void const *b = static_cast(“hello world”); b += 6; 生成这些 错误 : error C2070: ‘void’: illegal sizeof operand error C2036: ‘const void *’ : unknown size 此代码在GCC下工作,它将sizeof(void)视为1 。 有没有办法绕过这个限制,因为为了指针运算而显式地转换为char *会增加混淆( void *被很好地识别并用作指向原始内存的无类型指针)。 Update0 请注意,我很清楚标准的存在。 我想做原始指针算术。 我把sizeof(void)表示我很清楚它不是1的原因是问题的原因。 代码示例仅用于演示生成错误所需的内容。 我知道这不是使用void的“正常”方式,但这是C,这些事情发生了。 是的,人们需要在低级别这样做。 我不是在追求原因,我是在追求如何。 如果你想知道原因,请查看一些内核源代码或友好的glibc。 UPDATE1 看来这个问题引起了很大的混乱。 问题不在于为什么 sizeof(void) == 1不是标准的,而是什么时候不做。 […]

海湾合作委员会:禁止使用某些登记册

这是一个奇怪的请求,但我有一种感觉,它可能是可能的。 我想要的是将一些pragma或指令插入到我的代码区域(用C语言编写),这样GCC的寄存器分配器就不会使用它们。 我知道我可以做这样的事情,这可能会为这个变量留下这个寄存器 register int var1 asm (“EBX”) = 1984; register int var2 asm (“r9”) = 101; 问题是我直接插入新指令(用于硬件模拟器),而GCC和GAS还没有识别出这些指令。 我的新指令可以使用现有的通用寄存器,我想确保我保留了一些(即r12-> r15)。 现在,我正在模拟环境中工作,我想快速完成我的实验。 将来我会添加GAS并将内在函数添加到GCC中,但是现在我正在寻找快速修复。 谢谢!

GCC的__attribute __((__ packed__))是否保留原始排序?

目的 我正在用C编写一个网络程序(特别是gnu89 ),我想通过将某个struct X重新解释为大字节数组(也就是char ),通过网络发送字节,并将它们重新解释为struct X来简化事情。另一边。 为此我决定使用gcc的__attribute __((__ packed__))。 我已尽力确保正确完成(即我已经考虑了字节序和其他相关问题)。 题 除了保证struct X尽可能小,gcc是否保证使用__attribute __((__ packed__))定义的struct保留原始排序? 我已经做了相当多的搜索,我还没有找到关于这种保证是否存在的任何文件。 笔记 可以安全地假设发送方和接收方都不会遇到可移植性问题(例如服务器上的sizeof(int)等于客户端上的sizeof(int) )。

当计算结果在运行时导致NaN或inf时,我可以让gcc告诉我吗?

有没有办法告诉gcc抛出一个SIGFPE或类似的东西来响应在运行时产生NaN或(-)inf的计算,就像它会被零除? 我已经尝试了-fsignaling-nans标志,这似乎没有帮助。

常见C ++优化技术列表

我可以获得一系列常见的C ++优化实践吗? 我的意思是优化是你必须修改源代码才能更快地运行程序,而不是改变编译器设置。

使用进位标志添加多字

GCC具有128位整数。 使用这些我可以让编译器使用mul (或只有一个操作数的imul )指令。 例如 uint64_t x,y; unsigned __in128 z = (unsigned __int128)x*y; 生产多 我用它来创建一个128×128到256的函数(在更新之前,请参阅此问题的结尾,如果您感兴趣,请参阅此代码)。 现在我想要进行256位加法,除了使用汇编之外,我还没有找到让编译器使用ADC的方法。 我可以使用汇编程序,但我想要内联函数以提高效率。 编译器已经生成了一个有效的128×128到256函数(因为我在这个问题的开头解释了)所以我不明白为什么我应该在汇编中重写它(或者编译器已经有效实现的任何其他函数) 。 这是我提出的内联汇编函数: #define ADD256(X1, X2, X3, X4, Y1, Y2, Y3, Y4) \ __asm__ __volatile__ ( \ “addq %[v1], %[u1] \n” \ “adcq %[v2], %[u2] \n” \ “adcq %[v3], %[u3] \n” \ “adcq %[v4], %[u4] \n” \ : […]

C:标准和编译器中的整数溢出

由Carl Norum编辑,包括适当的标准参考。 C标准规定 如果在计算表达式期间发生exception情况 (即,如果结果未在数学上定义或未在其类型的可表示值范围内),则行为未定义。 是否有编译器开关可以保证整数溢出时的某些行为? 我想避免鼻腔恶魔。 特别是,我想强制编译器包装溢出。 为了唯一性,让标准为C99,编译器为gcc。 但我会对其他编译器(icc,cl)和其他标准(C1x,C89)的答案感兴趣。 事实上,为了惹恼C / C ++人群,我甚至欣赏C ++ 0x,C ++ 03和C ++ 98的答案。 注:国际标准ISO / IEC 10967-1可能与此相关,但据我所知,仅在资料性附录中提及。

mingW中的标准C库

我已经安装了mingW来使用gcc,平台windows 7.我试图找到mingW文件夹中的标准C库libc.a。 没有运气..是否以其他名称存储?