Tag: gcc

如何修改const变量的值?

我能够在gcc中更改const修改变量的值,但不能在其他编译器中更改。 我在gcc上尝试了这个代码,它更新了i和j (11)的值。 使用在线编译器 ,我得到不同的值。 #include void main() { const int i=10; int *j; j = &i; (*j)++; printf(“address of j is %p address of i is %p\n”,j,&i); printf(“i is %d and j is %d\n”,i,*j); }

如何在GCC中解决包含文件名冲突的问题?

我在不同的库中有两个名为string.h头文件,它们相互冲突,甚至与同名的标准C包含文件冲突。 除标准之外,不需要使用任何string.h ,但我需要在GCC搜索路径中包含库头文件路径。 目前我使用类似-I /usr/local/include/lib1 -I /usr/local/include/lib2 ,但这样我就不能包含标准的C string.h 。 解决此类冲突的正确方法是什么?

Clang使用-nostdlib生成崩溃代码

我正在为可执行文件设置我自己的运行时环境,我不能得到clang(v3.4-1ubuntu1,target:x86_64-pc-linux-gnu)来生成一个不会发生段错误的可执行文件。 我已将问题减少到以下几点: 如果我有一个文件crt1.c除了满足_start符号的链接器要求之外什么都不做: void _start(char *arguments, …) { } 然后我用clang -nostdlib crt1.c编译它,它产生以下可执行文件(来自objdump -d a.out ): a.out: file format elf64-x86-64 Disassembly of section .text: 0000000000400150 : 400150: 55 push %rbp 400151: 48 89 e5 mov %rsp,%rbp 400154: 48 81 ec f0 00 00 00 sub $0xf0,%rsp 40015b: 84 c0 test %al,%al 40015d: 0f 29 bd 30 […]

地址长度的字符串文字

我看到在使用GCC的Linux系统上,字符串文字的地址似乎比其他变量小得多。 例如,以下代码生成下面显示的o / p。 #include int main() { char *str1 = “Mesg 1”; char *str2 = “Mesg 2”; char str3[] = “Mesg 3”; char str4[] = “Mesg 4”; printf(“str1 = %p\n”, (void *) str1); printf(“str2 = %p\n”, (void *) str2); printf(“&str3 = %p\n”, (void *) str3); printf(“&str4 = %p\n”, (void *) str4); return 0; } […]

MAX使用gcc的typeof扩展名

我已经用C语言编程了很长一段时间。所以我决定学习一些关于gcc编译器扩展的高级CI。我看到了MAX()的代码,我现在已经实现如下 #define MAX(x,y) ((x) > (y)? (x): (y)) 这是我发现的新定义。遗憾的是,我甚至无法理解下面的代码是做什么的? 为什么我会这样做,而不是如上所述? #define MAX(a,b) \ ({ \ typeof (a) _a = (a); \ typeof (b) _b = (b); \ _a > _b ? _a : _b; })

如何使用Cython强制使用长双打?

我提前为我对C的不良知识道歉:我使用Python编写代码,并使用标准C函数编写了一些Cython模块,以大大提高速度。 但是,我需要一个高于1e308的范围(是的,你读得对),这是我目前通过使用类型double complex和函数cexp和cabs 。 我试图使用函数cexpl和cabsl ,并声明我的变量是long double complex类型,但是在1e308之后我仍然遇到溢出。 这可能意味着我的编译器将长双精度转换为双精度数,是吗? 但根据维基百科, 使用GNU C编译器,x86处理器的长双精度是80位扩展精度,无论该类型使用的物理存储器是什么(可以是96位或128位)。[4] 我正在使用带有Linux Linux的64位系统(如果重要的话,还有Python 2.7.8)。 如何编写强制使用长双打的Cython模块? 对于我正在做的一些科学计算,我需要这么大的数字。 编辑:使用标志-m128bit-long-double进行编译会得到相同的结果。 如此处所示, 在x86-64编译器中,-m128bit-long-double是默认选择,因为它的ABI指定long double要在16字节边界上对齐。 所以这似乎没什么区别。 我还运行了以下程序来检查系统上的范围: #include #include int main() { printf(“Storage size for float : %d \n”, sizeof(float)); printf(“Minimum float positive value: %E\n”, FLT_MIN ); printf(“Maximum float positive value: %E\n”, FLT_MAX ); printf(“Precision value: %d\n”, FLT_DIG ); […]

gcc如何确定基于C的函数将使用的堆栈大小?

我用C编程语言编写程序,并使用objdump将可执行文件转换为asm文件。 我不知道gcc如何确定函数将使用的堆栈大小? int a() { int temp[1024 * 1024]; temp[0] = 1; return temp[0]; } 这只是问题的解释,忽略它是天真的。 gcc是否会为函数a分配1024 * 1024字节的空间? 如果函数有点复杂,有时会有很多局部变量,编译器如何确定堆栈大小?

在系统verilog代码中集成fftw C函数调用

我在linux系统上成功安装了fftw C库。 以下是有关fftw c => http://www.fftw.org/的更多信息。我有一个示例C代码,可以成功调用fftw C函数。 下面是一个C ccode和命令来运行C代码:代码: #include #include #include #include #include int main(void) { double FFT_in[] = {0.1, 0.6, 0.1, 0.4, 0.5, 0, 0.8, 0.7, 0.8, 0.6, 0.1,0}; double *IFFT_out; int i,size = 12; fftw_complex *middle; fftw_plan fft; fftw_plan ifft; middle = (fftw_complex*) fftw_malloc(sizeof(fftw_complex)*size); IFFT_out = (double *) malloc(size*sizeof(double)); fft = fftw_plan_dft_r2c_1d(size, […]

如何编写内联gnu扩展程序集的短块来交换两个整数变量的值?

为了娱乐,我正在使用带有32位Linux目标的x86的AT&T语法学习gnu扩展汇编。 我花了最后三个小时编写了两个可能的解决方案来解决我交换两个整数变量a和b的值的挑战,我的解决方案都没有完全解决我的问题。 首先,让我们更详细地看一下我的TODO障碍: int main() { int a = 2, b = 1; printf(“a is %d, b is %d\n”, a, b); // TODO: swap a and b using extended assembly, and do not modify the program in any other way printf(“a is %d, b is %d\n”, a, b); } 在阅读本HOWTO之后 ,我编写了以下内联扩展汇编代码。 这是我第一次尝试交换整数: asm volatile(“movl %0, […]

如何在Crosstools-NG中使用candian以跨越本土的方式在arm板上使用gcc?

据我所知,要在armv5板上使用gcc编译可执行文件,同时使用我的x86机器编译该臂本机gcc,我需要这个设置: 配置工具链组件的机器:配置机器:x86_64 机器构建工具链组件:构建机器:x86_64 运行工具链的机器:主机:ARM 机器工具链正在生成以下代码:目标机器:ARM 基于阅读这里的交叉文档,我应该使用跨本机设置,但是当我尝试使用ct-ng menuconfig启用它时,我需要启用: Paths and misc options -> Try features marked as EXPERIMENTAL实验Paths and misc options -> Try features marked as EXPERIMENTAL Toolchain options -> Type (Cross) -> Cross-native (NO CODE!) (EXPERIMENTAL) 但当然Cross-Native不起作用,因为它没有代码。 谷歌搜索带我到这个和这个讨论在邮件列表上说我应该尝试使用加拿大的构建样式,但我有点迷失了什么元组和什么用于Build System和Host System在crosstool-ng的menuconfig ,或者如果这仍然是考虑两个讨论如何超过3年的正确方法。 关于SO的post似乎暗示构建系统和主机系统元组应该是arm-unknown-linux-gnueabi ? 为了清楚起见,我已经能够使用crosstool-ng生成的交叉编译器编译和运行可执行文件,现在我想在armv5系统上安装编译器。 编辑 :所以我刚刚将crosstools-ng生成的普通交叉编译器( arm-unknown-linux-gnueabi )添加到Toolchain options -> General toolchain options -> Host […]