我遇到了在不支持SSE4.1的系统上运行我的旧代码的崩溃,我调试了一下并在glibc中找到了SSE指令,这可能吗? 为什么不在gcc 4.8.1发布说明中报告这个?
我正在学习C,但我对Java等高级编程语言有很长的经验。 我正在阅读有关头文件的内容,所以我正在玩它们,但是我注意到我可以从另一个文件调用一个函数而不用#including它(它在同一个目录中),这怎么可能?! 是make文件,配置那种方式的链接器还是什么? 我们有两个文件 main.c add.c main.c从add add.c调用函数add(int x,int y) ,但是在#including add.c之前我错误地编译了它并且它工作了! 更令人困惑的是,当我#include add.c时,它会在函数add上产生多重定义错误
在c程序中,我想做不同的事情。 该程序将在基于x86 / x64的GNU / Linux系统以及基于ARM的系统(例如PC或RaspberryPI)上运行。 GCC中是否有预定义的宏来告诉平台? 就像是 #ifdef _X64_ /do x64 stuff #elif _ARM_ //do arm stuff #endif 或者这可能是错误的做法? 我将使用Makefile进行编译,我可以使用自己的定义。 什么是最好/最安全的方法?
据我所知,每次调用函数后都会丢弃局部变量。 但是当我执行这段代码时,变量保留了它们之前的值。 这是什么行为? 编译器:gcc 4.8.4 #include void t(); int main(void){ t(); t(); t(); return 0; } void t(){ int i; i++; printf(“%d\n”,i); } 输出: 4bh1@mybox:~/C-fi$ ./test 1 2 3
这里的GCC doc指定了_buitin_prefetch的用法。 第三个论点是完美的。 如果为0,则编译器生成prefetchtnta(%rax)指令如果为1,编译器生成prefetcht2(%rax)指令如果为2,则编译器生成prefetcht1(%rax)指令如果为3(默认值),则编译器生成prefetcht0 (%rax)指令。 如果我们改变第三个参数,操作码已经相应地改变了。 但第二个论点似乎没有任何影响。 __builtin_prefetch(&x,1,2); __builtin_prefetch(&x,0,2); __builtin_prefetch(&x,0,1); __builtin_prefetch(&x,0,0); 以上是生成的示例代码: 以下是assembly: 27: 0f 18 10 prefetcht1 (%rax) 2a: 48 8d 45 fc lea -0x4(%rbp),%rax 2e: 0f 18 10 prefetcht1 (%rax) 31: 48 8d 45 fc lea -0x4(%rbp),%rax 35: 0f 18 18 prefetcht2 (%rax) 38: 48 8d 45 fc lea -0x4(%rbp),%rax 3c: 0f 18 […]
我在互联网上找到了__sync_val_compare_and_swap的实现: #define LOCK_PREFIX “lock ; ” struct __xchg_dummy { unsigned long a[100]; }; #define __xg(x) ((struct __xchg_dummy *)(x)) static inline unsigned long __cmpxchg(volatile void *ptr, unsigned long old, unsigned long new, int size) { unsigned long prev; switch (size) { case 1: __asm__ __volatile__(LOCK_PREFIX “cmpxchgb %b1,%2” : “=a”(prev) : “q”(new), “m”(*__xg(ptr)), “0”(old) : “memory”); return […]
我在C中使用glib.h编写简单的程序,但是当我编译它时,我得到一个错误: $ gcc test.c -o test test.c:3:18: fatal error: glib.h: No such file or directory compilation terminated. 所以从上面看来gcc找不到glib.h文件(这是libglib2.0-dev软件包的一部分并且已经安装了它)。 所以首先我尝试在我的系统中找到glib.h文件并找到如下输出: $ locate glib.h /usr/src/linux-headers-3.2.0-29-generic-pae/include/config/blk/dev/bsglib.h /usr/src/linux-headers-3.2.0-48-generic-pae/include/config/blk/dev/bsglib.h /usr/src/linux-headers-3.2.0-57-generic-pae/include/config/blk/dev/bsglib.h 然后我尝试了命令: $ pkg-config –cflags glib-2.0 -I/usr/include/glib-2.0 -I/usr/lib/i386-linux-gnu/glib-2.0/include 为GCC获得正确的标志,但它仍然显示相同的错误。 所以试着从SO中找到解决方案并找到精确的解决方案 $ gcc test.c -Wall -o test `pkg-config –cflags –libs glib-2.0` 这个命令解决了我的问题 但我有疑问,是不是有任何方法可以告诉gcc包含glib库所以不需要在gcc之后给出标志pkg-config –cflags –libs glib-2.0并简单地通过gcc test.c -o test编译我的文件?
我一直在考虑如何刷新scanf函数中的错误条目,以允许循环提示完成它们的工作。 我在这里有一个函数调用来刷新输入。 这可行,但如果我在输入int时输入2q这样的东西,它仍然是错误的。 void flushKeyBoard() { int ch; //variable to read data into while((ch = getc(stdin)) != EOF && ch != ‘\n’); } 然后我会在另一个函数中有这样的东西: printf(“Enter a value: “); check = scanf(“%f”, &b); while(check == 0) { printf(“Invalid number entered. Please re-enter: “); check = scanf(“%f, &b”); flushKeyBoard(); } 还有更好的想法? 有人建议fflush(); 但在这里使用它并不是真正的标准..
我正在尝试编写printf克隆代码。 我已经构建了一个名为“libftprintf.a”的库文件,但是当我尝试使用它时,我在Mac OSX 10.8.5上收到以下错误: ld: warning: ignoring file ./libftprintf.a, file was built for archive which is not the architecture being linked (x86_64): ./libftprintf.a 奇怪的是,这工作正常(但我只需要一个名为libftprintf的lib,所以这是不可接受的): gcc -Wall -Wextra -Werror -I libft/includes/ -o ft_printf_test.bin -L libft -lft -L. -lftprintf ft_printf_test.c 我怀疑我滥用ar命令将两个lib链接在一起。 但我还没有弄错。 可能是什么原因? 在尝试将libftprintf.a文件与make test命令一起使用之前,所有内容似乎都可以正常编译。 我在Google上搜索了一个解决方案,但大多数答案仅与XCode有关。 根据lipo -info ,文件是x86_64。 我的GCC版本: $> gcc –version Configured with: –prefix=/usr –with-gxx-include-dir=/usr/include/c++/4.2.1 […]
我有一个看起来像的头文件 header.h int TOS; 该文件仅包含在一个代码文件中 code.c #include “header.h” TOS=0; 编译code.c时,GCC会发出警告 code.c:3:1:警告:数据定义没有类型或存储类[默认启用] code.c:3:1:警告:在’TOS’声明中默认为’int’类型[默认启用] 我不明白这个警告的原因。 它不等同于在code.c中声明和定义TOS吗? 即 code.c int TOS; TOS=0;