Tag: gcc

-fwrapv做什么?

任何人都可以提供一些代码示例,当使用fwrapv vs编译时,它们的行为会有所不同。 它说–fwrapv应该“假设加法,减法和乘法的带符号算术溢出,使用二进制补码表示包装。” 但每当我尝试溢出时,无论有没有fwrapv,结果都是一样的。

为什么三字母在现代C ++编译器中会产生错误?

即使在GCC编译器中,如果没有明确指定trigraph属性,也不会编译三字符。 #include int main() { int a=4; if((a==4) ??! (a==5)) printf(“\nHello world!”); return 0; } 保存为try.c的程序仅在我们指定gcc -Wall -trigraphs try.c时才在GCC编译器中编译,它仍然显示警告。 你可以招募一些能够处理和处理三字符而没有任何错误或警告的编译器吗?

C中的可移植嵌套函数

是否可以使用嵌套函数/块编写可移植C代码? 我知道gcc只支持嵌套函数作为非标准扩展,而clang只支持块 – 但是有没有办法编写可以使用标准C和MACROS进行编译的代码? 如果不可能 – 最好的工作是什么? 举个例子,如何实现一个带参数的以下类型的可移植版本? 海湾合作委员会的简单例子: int main(int argc, char*[] argv) { char reverse = 0; int cmp_func(const void *a, const void *b) { const int* aa = (const int)a; const int* bb = (const int)b; return (reverse) ? aa – bb : bb – aa; } int list[8] = {1,2,3,4,5,20,100,200}; qsort(list, […]

使用GCC + ARM减少递归期间的堆栈使用

我有一个用于嵌入式ARM处理器的递归下降解析器(在C + GCC中,用于ARM Cortex M3)。 在运行它的同时我注意到它使用了大量的堆栈空间(甚至超出了你的预期)并且经过仔细检查我发现这种情况正在发生: extern int bar(int *p); int foo() { int z = foo(); // it’s an example! int n[100]; // stack usage return z+bar(n); // calling bar(n) stops n from being optimised out } 运行arm-none-eabi-gcc -fomit-frame-pointer -S test.c的结果 foo: str lr, [sp, #-4]! ; Push link register sub sp, sp, #412 […]

没有强制转换的整数指针

当我调用一个需要指针的函数,并传入一个值时,我得到了这个警告,我喜欢这样。 但是当值恰好是字面值’0’时,我没有得到警告。 我认为这是因为C认为它是空指针,而不是值。 有没有办法仍然得到0字面的警告,因为我已经有一些错误因为它。

malloc和gcc优化2

while(count < 30000000){ malloc(24); count++; } 上面的代码在我用gcc -O0编译的计算机上运行大约170毫秒。 但是,使用-Ox进行编译,其中x> 0,优化器巧妙地指出所请求的内存永远不会被使用,因此它被排除在优化的可执行文件之外。 它是如何做到的?

typeof()表达式中的副作用

在GNUC C中,您可以使用typeof(expression) ,并且使用内部具有副作用的表达式是合法的。 例如,你可以拥有这个C代码: int x = 0; typeof(x++) y; 在这种情况下,副作用被忽略,之后x仍然为零(这是有道理的,因为类型只是编译时的事情)。 但是, 海湾合作委员会的文件说: 当且仅当它是可变修改类型的表达式或这种类型的名称时,才评估typeof的操作数的副作用。 这句话是什么意思? 是否真的可以编写带有副作用的typeof并且实际上在运行时执行副作用? 对我来说,这句话似乎表明了这一点。

未定义引用`_GetAdaptersAddresses @ 20′ – 但我包括-liphlpapi

我在cygwin下使用gcc编写一些代码,在我的代码中调用来自iphlpapi.h GetAdaptersAddresses我已经将_WIN32_WINNT设置_WIN32_WINNT高于所需的0x0501并且在链接器行上我添加了-liphlpapi但是链接器仍然失败了以下内容信息: gcc -liphlpapi build/obj/*.o -Wall -Wextra -o build/bin/asdf.exe src/asdf.cpp /tmp/ccdjLPVY.o:asdf.cpp:(.text+0x153): undefined reference to `_GetAdaptersAddresses@20′ collect2: ld returned 1 exit status 来自asdf.cpp一些片段: #if _WIN32_WINNT < 0x0501 #warning _WIN32_WINNT was set lower than 0x0501, fixing #undef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif #include #include 我知道他们在那里蠢蠢欲动: strings /usr/i686-pc-mingw32/sys-root/mingw/lib/libiphlpapi.a | sort | uniq | grep GetAdapters __imp__GetAdaptersAddresses@20 __imp__GetAdaptersInfo@8 _GetAdaptersAddresses@20 […]

为内联汇编创建常量池的正确方法是什么?

问题是在C函数内部我有一个内联汇编。 就像是 ldr r7, =0xdeadbeef svc 0 如果未明确创建文字池(这是这种情况),汇编程序会在翻译单元的末尾创建一个文字池。 通常这很好,但是如果翻译单元真的很大,那么这不起作用,因为文字池离ldr指令太远了。 所以,我想知道处理这个问题的最佳方法是什么。 最明显的方法是在内联汇编中手动创建文字池: ldr r7, =0xdeadbeef svc 0 b 1f .ltorg 1: 要么 ldr r7, 1f svc 0 b 2f 1: .word 0xdeadbeef 2: 不幸的是,由于冗余分支指令,这导致了次优代码。 我不希望汇编器足够聪明,为函数内部的常量池找到合适的位置。 我想要做的是在函数的末尾创建一个常量池。 有没有办法告诉编译器(gcc)在函数末尾创建一个文字池? PS我最终使用了movw/movt对而不是常量池。 虽然,首先,movw / movt解决方案的可移植性略低于文字池,其次,我只是想知道是否可以可靠而有效地在内联汇编中使用常量池。 更新: 那么,处理问题的最佳方法是什么? 要强制工具链在函数之后创建常量池,可以将函数放在单独的代码部分中。 它的工作原理是因为在翻译单元结束时汇编程序为每个部分生成单独的常量池。 实际上, 最好的方法是避免将常量加载到内联汇编中的寄存器中。 让编译器这样做会更好。 在我的情况下,我最终写了一个类似的代码 register int var asm(“r7”) = 0xdeadbeef; asm […]

双指针转换,使用`const void ** ptr`参数传递给函数

海湾合作委员会给了我以下警告: note: expected ‘const void **’ but argument is of type ‘const struct auth ** 有没有可能导致问题的情况? 更大的片段是 struct auth *current; gl_list_iterator_next(&it, &current, NULL); 函数只存储在current一些void *指针中。