我有一个宏使用GCC的typeof来创建一个相同类型的宏参数的变量。 问题是:如果该参数具有const类型,则在宏内创建的变量是const ,我不能使用它。 例如: #include #define DECR(x) ({typeof(x) y; y = x; y–; y;}) int main(void) { const int v = 5; printf(“%d\n”, DECR(v)); return 0; } 汇编给出: $ cc -c -o to tc tc: In function ‘main’: tc:9:2: error: assignment of read-only variable ‘y’ tc:9:2: error: decrement of read-only variable ‘y’ make: *** [to] […]
在我的回答中,我提到解除引用void指针是一个坏主意。 但是,当我这样做时会发生什么? #include int main (void) { void* c = malloc(4); *c; &c[0]; } 汇编: gcc prog.c -Wall -Wextra prog.c: In function ‘main’: prog.c:4:2: warning: dereferencing ‘void *’ pointer *c; ^~ prog.c:5:4: warning: dereferencing ‘void *’ pointer &c[0]; ^ prog.c:5:2: warning: statement with no effect [-Wunused-value] &c[0]; ^ 这是来自Wandbox的图片,对于那些说它没有发生的人: 和Ideone中的现场演示 。 它实际上会尝试读取c指向的内存,然后获取该结果,但实际上什么都不做? 或者这条线根本没有效果(但GCC不会产生警告)。 我在想,既然编译器对数据类型一无所知,在不知道类型大小的情况下,它将无法做很多事情。 为什么derefencing […]
我用gcc test.c或clang test.c编译了这个C程序: int main (void) { return 0; } valgrind ./a.out给了我这个: ==9232== Memcheck, a memory error detector ==9232== Copyright (C) 2002-2011, and GNU GPL’d, by Julian Seward et al. ==9232== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info ==9232== Command: ./a.out ==9232== ==9232== Conditional jump or move depends on uninitialised value(s) ==9232== […]
让我们假设我有一个结构: struct A { uint16_t a; uint64_t b; }; 有没有办法获得A w / o填充的大小? ie:所有成员的sizeof总和(即使它不是递归的)。 通常sizeof(A) == 16.我想要__GCC_sizeof__(A) == 10 。 我希望它在测试代码中不影响实际代码,这意味着在结构定义中没有”#pragma”和”__attribute__” 。 (尽管可以使用#ifdef TEST完成,但它非常难看)。 它不一定是便携式的, GCC就足够了。 谢谢!
我正在使用嵌入式系统。 该应用程序在AT91SAMxxxx和cortex m3 lpc17xxx上运行。 我正在研究动态内存分配,因为它会极大地改变应用程序的面貌(并给我更多的权力)。 我认为我唯一真正的路线是为堆设置一个内存区域,并设计一个最适合(双关)我的目的的定制malloc。 在查看不同的内存分配算法时,你不能偶然发现Doug Lea的malloc。 我认为这已经在我的嵌入式系统中使用过,那里没有操作系统和量身定制的版本,比如提供了sbrk()函数来实现这一目标。 我试图找到很好的例子来实现这个目标,或者在我开始编写自己的概念之前尝试一个概念validation。 是否可以在我的系统中使用dlmalloc? 如果有,是否有人可以指向相关资源? (找不到很多帮助我的人) 是不是更好地去编写我自己的malloc来满足我的需求? 并且道歉我到目前为止的大多数研究都是设计一个不使用道格的malloc,这是一个不同的挑战。 猜猜我试图找出更深入地研究这条路线是浪费时间。 编辑: 这个故事的寓意:在我的案例中看dlmalloc毫无意义。
add2.c: int counter=0; int a=0; int b; int c; int add(int a, int b) { return a+b; } 编译:gcc -c add2.c -o add2.o 阅读符号表:readelf –symbols add2.o Symbol table ‘.symtab’ contains 12 entries: Num: Value Size Type Bind Vis Ndx Name 0: 00000000 0 NOTYPE LOCAL DEFAULT UND 1: 00000000 0 FILE LOCAL DEFAULT ABS add2.c […]
我正在研究32位Fedora 14系统。 我正在使用gcc编译我的源代码。 有人知道如何在编译c代码时禁用警告吗?
gcc -I/opt/cplex-studio-125/cplex/include -lcplex -L/opt/cplex-studio-125/cplex/lib/x86-64_sles10_4.1/static_pic mipex1.c 我正在尝试从cplex编译一个例子。 -I选择没问题。 -L选项似乎已损坏,因为它无法找到函数名称。 错误在哪里? 在特定的链接中有一个libcplex.a 。 /tmp/ccf5sKky.o: In function `main’: mipex1.c:(.text+0x9f): undefined reference to `CPXopenCPLEX’ mipex1.c:(.text+0xee): undefined reference to `CPXgeterrorstring’ mipex1.c:(.text+0x125): undefined reference to `CPXsetintparam’ mipex1.c:(.text+0x222): undefined reference to `CPXcreateprob’ mipex1.c:(.text+0x2e1): undefined reference to `CPXcopylp’ mipex1.c:(.text+0x334): undefined reference to `CPXcopyctype’ mipex1.c:(.text+0x380): undefined reference to `CPXmipopt’ mipex1.c:(.text+0x3cc): undefined reference to `CPXgetstat’ […]
我一直在寻找如何将BSWAP用于64位寄存器的低32位子寄存器的答案。 例如, 0x0123456789abcdef在RAX寄存器中,我想用一条指令将其更改为0x01234567efcdab89 (因为性能)。 所以我尝试了以下内联函数: #define BSWAP(T) { \ __asm__ __volatile__ ( \ “bswap %k0” \ : “=q” (T) \ : “q” (T)); \ } 结果是0x00000000efcdab89 。 我不明白为什么编译器就像这样。 有人知道有效的解决方案吗?
我发现Microsoft Visual Studio编译器和gcc以不同的方式预处理以下小片段: # define M3(x, y, z) x + y + z # define M2(x, y) M3(x, y) # define P(x, y) {x, y} # define M(x, y) M2(x, P(x, y)) M(a, b) ‘gcc -E’给出以下内容: a + {a + b} ,’cl / E’发出关于缺少宏参数的警告并产生以下输出: a + {a, b} + 似乎来自嵌套宏扩展的逗号不被视为参数分隔符。 不幸的是,我没有找到cl预处理器中实现的算法的描述,所以我不确定我的建议是否正确。 有谁知道cl预处理器是如何工作的,它的算法和gcc之间有什么区别? 以及如何解释观察到的行为?