Tag: gcc

符号etext,edata和end定义在哪里?

这是来自Linux手册页的代码: #include #include extern char etext, edata, end; int main() { printf(“First address past:\n”); printf(” program text (etext) %10p\n”, &etext); printf(” initialized data (edata) %10p\n”, &edata); printf(” uninitialized data (end) %10p\n”, &end); exit(EXIT_SUCCESS); } 运行时,下面的程序产生如下输出: $ ./a.out First address past: program text (etext) 0x8048568 initialized data (edata) 0x804a01c uninitialized data (end) 0x804a024 etext , edata […]

为什么在设置-std = c99时gcc不能找到random()接口?

我在源代码的顶部做”#include ” 。 示例编译: /usr/bin/colorgcc -std=c99 -fgnu89-inline -g -Wall -I/usr/include -I./ -I../ -I../../ -I../../../ -I../../../../ -O3 -o f8 f8.c In file included from f8.c:7: ctype-cmp.c: In function ‘randomized’: ctype-cmp.c:48: warning: implicit declaration of function ‘random’ ctype-cmp.c: In function ‘main’: ctype-cmp.c:153: warning: implicit declaration of function ‘srandom’ ais@xcalibur:t$ 当我关闭-std = c99时,无法找到函数isfinite()。 所以我确实想要使用-std = c99这个和其他原因。 有什么技巧我不见了?

GCC可以从最终输出中消除什么样的死代码?

我一直被告知编译器足以消除死代码。 我编写的大部分代码在编译时都知道很多信息,但代码必须以最通用的forms编写。 我不知道任何assembly,所以我无法检查生成的assembly。 什么样的代码可以在最终的可执行文件中有效消除? 几个例子但不限于 f(bool b){ if(b){ //some code }else{ //some code } } f(true); ////////////////////////// template f(){ if(b){ //some code }else{ //some code } } f(); /////////////////////////// 如果f定义在其他客观代码中并且被调用的f(true)在main中,那该怎么办? 链接时间优化会有效消除死代码吗? 什么是编码样式/编译器选项/技巧,以促进死代码消除?

如何初始化wchar_t变量?

我正在读这本书: C:在一个坚果壳中 ,在阅读了关于宽字符的字符集部分后,我写了这个程序: #include #include #include int main() { wchar_t wc = ‘\x3b1’; wprintf(L”%lc\n”, wc); return 0; } 然后我用gcc编译它,但是gcc给了我这个警告: main.c:7:15:警告:hex转义序列超出范围[默认启用] 并且程序不输出字符α(其unicode为U + 03B1),这是我想要它做的。 如何更改程序以打印字符α?

为什么未初始化的全局变量是弱符号?

似乎未初始化的全局变量在Gcc中被视为弱符号。 这背后的原因是什么?

链接时优化和内联

根据我的经验,有许多代码明确使用内联函数,这需要权衡: 代码变得不那么简洁,而且可维护性稍差。 有时,内联可以大大提高运行时性能。 内联是在一个固定的时间点决定的,可能没有对其用途的非常好的预知,或者没有考虑所有(未来)周围环境。 问题是:链接时优化(例如,在GCC中)是否呈现手动内联,例如,在C99中声明一个“内联”函数并提供一个实现,已经过时了? 我们是否真的不需要考虑自己内联大多数function? 那些总能从内联中受益的函数呢,例如deg_to_rad(x)? 澄清:我不是在考虑同一个翻译单元中的函数,而是考虑逻辑上应该存在于不同翻译单元中的函数。 更新:我经常看到反对“内联”,并建议过时。 然而,就个人而言,我确实经常看到明确的内联函数:作为类体中定义的函数。

函数参数中的字符串

int main() { char *x = “HelloWorld”; char y[] = “HelloWorld”; x[0] = ‘Z’; //y[0] = ‘M’; return 0; } 在上面的程序中, HelloWorld将处于只读部分(即字符串表)。 x将指向该只读部分,因此尝试修改该值将是未定义的行为。 但是y将被分配在堆栈中, HelloWorld将被复制到该内存中。 所以修改y将正常工作。 字符串文字:指针与字符数组 这是我的问题: 在以下程序中,如果内容被修改, char *arr和char arr[]都会导致分段错误。 void function(char arr[]) //void function(char *arr) { arr[0] = ‘X’; } int main() { function(“MyString”); return 0; } 它在function参数上下文中有何不同? 没有为函数参数分配内存? 请分享您的知识。

从OS X上的C中的dlopen()ed动态库访问主程序全局变量

我正在维护一个具有类似插件function的小应用程序 ,它通过运行时加载的动态模块实现。 具体来说,因为它是一个Gtk +应用程序,我正在使用gmodule,但问题也适用于基于dlfcn.h / dlopen()的动态库加载。 我的主程序有一个包含一些全局信息的全局结构变量。 我希望这些信息可用于动态加载的插件中定义的函数。 在Linux上,我可以直接引用这个全局变量 – 这很好用,我猜测gcc或链接器负责将全局变量从主程序导出到动态库。 问题是,这在Mac OS X上不起作用。有没有办法在OS X上执行此操作? 如果没有,是否有更多的“最佳实践”方法将全局信息公开给动态加载的库?

如何将64位整数打印为hex?

使用以下代码,我尝试使用printf()输出unit64_t变量的值。 使用gcc编译代码,返回以下警告: 警告:格式’%x’需要’unsigned int’类型的参数,但参数2的类型为’uint64_t'[ – Wformat =] 代码: #include #include int main () { uint64_t val = 0x1234567890abcdef; printf(“val = 0x%x\n”, val); return 0; } 输出: val = 0x90abcdef 预期产量: val = 0x1234567890abcdef 如何使用printf()将64位值输出为hex整数? 在这种情况下, x说明符似乎是错误的。

对main的未定义引用 – collect2:ld返回1退出状态

我正在尝试编译一个程序(称为es3),但是,当我从终端写入时: gcc es3.c -o es3 看来这条消息: /usr/lib/gcc/i686-linux-gnu/4.4.5/../../../../lib/crt1.o: In function `_start’: (.text+0x18): undefined reference to `main’ collect2: ld returned 1 exit status 我能做什么?