Tag: gcc

为什么“字符串数组的初始化字符串太长”在C中编译得很好而不是在C ++中编译?

以下程序使用警告在C中编译好,但在C ++中编译失败。 为什么? 是什么原因? #include int main(void) { char a[5]=”Hello”; a[0]=’y’; puts(a); for(int i=0;i<5;i++) printf("%c",a[i]); return 0; } 警告: Warning:[Error] initializer-string for array of chars is too long [-fpermissive] enabled by default 但是如果程序编译为C ++程序,则C ++编译器会出现以下错误: [Error] initializer-string for array of chars is too long [-fpermissive] 我正在使用GCC 4.8.1编译器。

除非Haswell指明,否则GCC会很难编制前导零数

GCC支持__builtin_clz(int x) builtin,它计算参数中前导零 (连续最重要的零)的数量。 除了0之外 ,这对于有效地实现lg(unsigned int x)函数非常有用,它取lg(unsigned int x)的基数为2的对数,向下舍入为1 : /** return the base-2 log of x, where x > 0 */ unsigned lg(unsigned x) { return 31U – (unsigned)__builtin_clz(x); } 这是直截了当的方式 – 特别是考虑情况x == 1和clz(x) == 31 – 然后x == 2^0所以lg(x) == 0和31 – 31 == 0我们得到正确的结果。 较高的x值类似地起作用。 假设内置程序有效实现,这比其他纯C解决方案更好。 现在,它发生了, 计数前导零操作本质上是x86中bsr指令的双重。 返回参数中最重要的1位2的索引。 因此,如果有10个前导零,则第一个1位位于参数的第21位。 […]

Windows 8中的Dev C:gcc内部错误

我是C编程类的教师助手,教师使用Dev C ++作为该类的编译器。 就个人而言,我会使用另一种,但选择不是我的。 最近我在Dreamspark上安装了Windows 8 Professional 64位,虽然我的大学,所以我可以从一些地铁应用程序开发开始一些比赛。 不幸的是,Dev C ++已停止编译。 它以前在Windows 7 64位上运行良好。 编译报告时我收到错误: Compiler: Default compiler Executing gcc.exe… gcc.exe “C:\Users\James\Documents\Homework\TA_CPRE_185\counter.c” -o “C:\Users\James\Documents\Homework\TA_CPRE_185\counter.exe” -I”C:\Dev-Cpp\include” -L”C:\Dev-Cpp\lib” gcc.exe: Internal error: Aborted (program collect2) Please submit a full bug report. See for instructions. Execution terminated Compilation successful 它说编译成功但不是,因此没有可执行文件。 我想知道是否有人有任何想法可以让Dev C ++在这个版本的Windows上运行,所以我不必在虚拟机中运行Dev C ++? 我需要它工作,所以我可以做课堂演示。

GCC别名在翻译单元-AKA-之外运行,这甚至是适合这项工作的工具吗?

我正在使用STR32(Cortex-M3)上的FreeRTOS,并使用ST的CMSIS库来引导所有内容。 CMSIS库在启动“.s”文件中定义弱符号SVC_Handler 。 必须在某处重写它才能将ISR置于中断向量表中。 FreeRTOS定义了vPortSVCHandler ,这是我想要处理SVC中断的ISR。 我想使用我的应用程序代码(即没有修改FreeRTOS或CMSIS源代码)将两者“粘合”在一起。 我认为别名是工作的正确工具,所以我尝试了这个(在一个单独的源文件main.c中): void SVC_Handler(void) __attribute__ ((alias (“vPortSVCHandler”))); 这导致: error: ‘SVC_Handler’ aliased to undefined symbol ‘vPortSVCHandler’ 事实certificate,根据GCC文档http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html ,为了使用alias属性,您不能在翻译单元之外别名。 所以我想我会尝试将符号extern到main.c中,如下所示: extern void vPortSVCHandler( void ) __attribute__ (( naked )); void SVC_Handler(void) __attribute__ ((alias (“vPortSVCHandler”))); 这会产生相同的错误。 有什么建议??? 我真的想避免修改任何一个库。 我知道我可以编写一个简单调用vPortSVCHandler的函数SVC_Handler ,但这可能vPortSVCHandler ISR增加不必要的开销(可能取决于优化设置)。 注意:FreeRTOS示例通过自定义启动文件实现此目的。 我正在寻找一种方法来从C 或我的链接器脚本执行此操作。 编译器版本:gcc版本4.5.2(Sourcery G ++ Lite 2011.03-42) 目标:arm-none-eabi

在GCC或Cygwin中创建DLL?

我需要帮助将脚本(“iterator.c”)编译成DLL。 我不能使用VS2010,因为它不支持在C99标准中添加到C的function(我使用“complex.h”但VB不支持它)。 我一直在寻找替代品,但我发现的只是GCC,我不知道如何安装/使用(真的,我花了半个小时阅读文档,我甚至不懂我应该安装它,和Cygwin,我已经安装但我不知道如何使用它们。 另外,我已经安装了MinGW,但我认为它与Cygwin或多或少相同,我仍然不知道如何制作DLL。 这并不像我一直都懒惰甚至没有尝试过,只是因为这些编译器并不像我以前用过的任何东西(主要是Python IDLE和Visual Studio,它们让你很容易)。 我有点迷茫。 有人可以给我一些关于如何使用这个工具来制作我可以从另一个脚本访问的DLL的建议吗? 这非常重要。 先感谢您。

ANSI C(ISO C90):scanf可以读取/接受unsigned char吗?

简单的问题:scanf可以读取/接受“小整数”到ANSI C中的unsigned char吗? 示例代码un_char.c: #include #include int main(void) { unsigned char character; scanf(“%hhu”, &character); return EXIT_SUCCESS; } 编译为: $ gcc -Wall -ansi -pedantic -o un_char un_char.c un_char.c: In function ‘main’: un_char.c:8: warning: ISO C90 does not support the ‘hh’ gnu_scanf length modifier ISO C90不支持hh 。 那么在这种情况下可以使用什么scanf转换?

如何在不指定-O1的情况下获得gcc -O1优化

我知道-O1会自动打开某些标志。 但是,可以手动打开这些标志。 如果我没有指定-O1,那么仍然可以通过指定-O1打开的所有标志来获得-O1优化。 我试过了 -fthread-jumps -fcprop-registers -fguess-branch-probability 但它仍然没有做-O1优化。 我可以告诉我何时使用gprof,因为性能不是很好。 我打开哪些标志来获得-O1优化?

为什么GCC有时只在初始化之前检测到变量的使用?

我正在阅读一本书中的一些代码,当我决定在while语句之前进行更改以查看sec的未初始化值是什么while : #include #define S_TO_M 60 int main(void) { int sec,min,left; printf(“This program converts seconds to minutes and “); printf(“seconds. \n”); printf(“Just enter the number of seconds. \n”); printf(“Enter 0 to end the program. \n”); printf(“sec = %d\n”,sec); while(sec > 0) { scanf(“%d”,&sec); min = sec/S_TO_M; left = sec % S_TO_M; printf(“%d sec is %d […]

如何让gcc只生成可以直接加载到内存并执行的机器代码?

我想生成一个可以加载到内存中的文件(例如使用mmap ),然后跳转到该内存的开头来运行代码。 理想情况下,我希望选择使代码可重定位(可能效率低下)或指定代码期望加载的显式地址(这很痛苦),但任何一个都可能自行正常工作。

为什么在g ++中std :: intmax_t不是__int128_t?

我的问题很简单:因为std::intmax_t被定义为根据cppreference的maximum width integer type ,为什么它不对应于GCC中的__int128_t ?