Tag: gcc

为什么char name 可以容纳多个字符?

当我遇到这种情况时,我正在对一个主题进行一些研究。 假设以下C代码: #include int main() { char name[1]; scanf(“%s”,name); printf(“Hi %s”,name); return 0; } 我已经使用-fno-stack-protector进行了编译,并使用大于1的输入进行了测试,就像John一样,令我惊讶的是,它有效! 当输入长于1时,它不应该抛出分段错误吗? 最终它打破了Alexander作为输入(9),但它适用于任何小于9的东西。 为什么输入的时间长于名称数组长度? PS:我使用Ubuntu(64位),gcc版本4.8.4(Ubuntu 4.8.4-2ubuntu1~14.04)和CLion作为IDE。

GCC-无效使用Register

我正在为VS2012编译一个项目,为Windows编译GCC(CodeBlocks)。 在VS2012上一切都很完美。 在GCC下我得到以下编译错误: C:\Users\Piotrek\AppData\Local\Temp\ccfdl0Ye.s|164|Error: invalid use of register| C:\Users\Piotrek\AppData\Local\Temp\ccfdl0Ye.s|166|Error: invalid use of register| C:\Users\Piotrek\AppData\Local\Temp\ccfdl0Ye.s|221|Error: invalid use of register| ||=== Build finished: 3 errors, 14 warnings (0 minutes, 0 seconds) ===| 我正在使用编译器选项-fpermissive – 它应该与错误无关。 我只是无法理解为什么它指向Local Temp文件夹下的临时文件,并说我使用了错误的寄存器? 有没有人知道发生了什么?

如何获取我的代码的结束地址

我正在为一个课程项目从头开始编写一个实时操作系统。 我想在将代码下载到芯片后知道代码的结束地址,因为我打算使用空闲内存来获取堆栈空间,我需要确保不会覆盖现有代码。 我听说GCC提供的__end变量是代码的结尾,但我不知道__end的含义是什么以及如何在我的代码中使用它。 任何人都可以解释一下或提供一些材料的链接,因为我不能google __end? 非常感谢。

Cython致命错误:Python.h没有这样的文件或目录

我一直在使用Cython将我的Python文件编译成C文件,然后使用MinGW从C文件创建可执行文件。 Cython工作正常,我可以在命令行输入cython test.pyx并获取一个C文件。 问题是当我尝试从C文件编译可执行文件时。 如果我输入gcc test.c我会收到以下错误: test.c:4:20: fatal error: Python.h: No such file or directory #include “Python.h” ^ compilation terminated. 我真的很感激一些帮助。 我正在运行Windows 7和python 3.5。

预计会看到“字符串数组的初始化字符串太长”警告

我期望在下面的程序中使用gcc看到“charmer数组的初始化字符串太长”警告两个变量。 程序: int main() { char str1[4]=”1234″; char str2[3]=”1234″; (void)str1; // Remove unused variable warning. (void)str2; // Remove unused variable warning. return 0; } 但是,我只收到str2的警告。 以来 char str1[4]=”1234″; 相当于 char str1[4]= {‘1’, ‘2’, ‘3’, ‘4’, ‘\0’}; 我们不应该同样对str1发出警告吗? 这是gcc的缺陷吗? 编译命令: gcc -Wall -std = c99 soc.c -o soc gcc版本是4.8.4。 更新 刚才了解到 char str1[4]=”1234″; 不等于 char str1[4]= […]

没有与GCC的内存对齐

我正在处理一些分组数据。 我创建了用于保存数据包数据的结构。 这些结构是由python为特定的网络协议生成的。 问题在于,由于编译器对齐结构这一事实,当我通过网络协议发送数据时,消息最终会比我想要的更长。 这会导致其他设备无法识别该命令。 有没有人知道可以解决这个问题,这样我的打包器的大小应该是结构应该的大小,还是有办法可以关闭内存对齐?

确定预处理器中的优化级别?

-Og是一个相对较新的优化选项,旨在改进应用优化时的调试体验。 如果用户选择-Og ,那么我希望我的源文件激活备用代码路径以增强调试体验。 GCC提供__OPTIMIZE__预处理器宏 ,但只有在优化生效时才将其设置为1。 有没有办法学习优化级别,如-Og , -O3或-Og ,以便与预处理器一起使用?

使用GCC编译C项目时采用了哪些默认库

我有简单的应用: #include int main( int argc, char ** argv ) { printf( “hello”); exit( 0 ); } 当我用命令编译它时 gcc -c count_words.c 我有警告: warning: incompatible implicit declaration of built-in function ‘exit’ [enabled by default] exit( 0 ); 我试图找到定义exit()函数的位置。 并发现它是在stdlib.h定义的。 但它不包含在我的项目中,并且在编译命令中没有定义其他库。 如果我错了,请纠正我,但看起来像gcc默认使用一些库。 什么是这些库,是否可以告诉gcc不包括它们? 为什么编译器对exit(0)不满意,假设它以某种方式包含stdlib.h作为默认值?

为什么-Winit-self与-Wuninitialized分开

这个问题是关于让gcc编译器在输入拼写错误并用自己初始化变量时发出警告。 int f() { int i = i; return i; } 事实certificate除了-Wuninitialized之外你还需要-Winit-self标志 : -Winit-self ( -Winit-self C,C ++,Objective-C和Objective-C ++)警告用自己初始化的未初始化变量。 请注意,此选项只能与-Wuninitialized选项一起使用,而该选项仅适用于-Wuninitialized及更高版本。 我的问题是:为什么这不是-Wuninitialized的默认行为? 你想要警告未初始化变量的用例是什么,而不是自我初始化的变量,这同样麻烦?

如何列出链接器分配的代码对象w / gcc?

我正在构建一个由几个代码模块和一个静态库组成的嵌入式应用程序。 一些全局变量显式放在专用内存部分(即,不是默认的.data部分)。 处理器内存架构是4个库,创建了连续的物理内存空间。 在我的应用程序中,只有第一个库被保留用于代码,而其他3个库被保留用于显式分配的全局和一个小堆栈。 问题是代码部分(.text)现在超出了第一个库边界,我得到以下链接器错误消息: ./bin/ld: section .data_bank1 loaded at [0000000000002000,0000000000003fff] overlaps section .text loaded at [0000000000000630,00000000000020df] ./bin/ld: section .fini loaded at [00000000000020e0,00000000000020f9] overlaps section .data_bank1 loaded at [0000000000002000,0000000000003fff] 有没有办法在链接器检查节和对象重叠之前查看对象分配(可能在临时对象文件中),并中止构建?