Tag: gcc

C90中的可变长度结构

GNU C中允许零长度数组,因此可以进行初始化 struct line { int length; char contents[0]; }; struct line *thisline = (struct line *) malloc (sizeof (struct line) + this_length); thisline->length = this_length; 注意:我在这里指的是这个页面: http : //gcc.gnu.org/onlinedocs/gcc/Zero-Length.html (提供C中可变长度结构的基本介绍) 它继续说:“在ISO C90中,你必须给内容一个长度为1,这意味着你要浪费空间或使参数复杂化到malloc。” 那是什么意思? 有人可以举例说明如何在C90中初始化变长结构以帮助理解吗?

GCC的尾部呼叫优化有多“聪明”?

我刚刚讨论了以下两个C代码的讨论: for循环: #include #define n (196607) int main() { long loop; int count=0; for (loop=0;loop<n;loop++) { count++; } printf("Result = %d\n",count); return 0; } 递归: #include #define n (196607) long recursive(long loop) { return (loop>0) ? recursive(loop-1)+1: 0; } int main() { long result; result = recursive(n); printf(“Result = %d\n”,result); return 0; } 在看到这段代码时,我看到了recursive(loop-1)+1并认为“啊,这不是尾调用递归”,因为它在完成对recursive的调用之后还有工作要做; 它需要增加返回值。 […]

如何让gcc生成合适的代码来检查缓冲区是否充满了NUL字节?

我正在实现一个解析磁带存档的程序。 解析器逻辑的一部分是检查归档结束标记,该标记是一个充满NUL字节的512字节块。 我为此目的编写了以下代码,希望gcc能够很好地优化它: int is_eof_block(const char usth[static 512]) { size_t i; for (i = 0; i < 512; i++) if (usth[i] != '\0') return 0; return 1; } 但令我惊讶的是,gcc仍会为此生成可怕的代码,即使我明确允许它访问缓冲区中的整个512字节: is_eof_block: leaq 512(%rdi), %rax jmp .L239 .p2align 4,,10 .L243: addq $1, %rdi cmpq %rax, %rdi je .L242 .L239: cmpb $0, (%rdi) je .L243 xorl %eax, %eax […]

如何收集大型Makefile项目的所有依赖项?

在一个大型C项目中,我有一个顶级Makefile和许多子Makefile在不同的子目录中。 我需要收集编译的所有依赖项。 为此,我将-MMD添加到CFLAGS并获取一堆.d依赖文件。 这些.d文件分散在子目录中。 此外,依赖关系有时被写为绝对路径,有时作为与编译目录相关的路径,有时包含符号链接。 我编写了一个脚本,它可以找到所有.d文件,遍历它们的目录,并解析所有找到的路径。 这有效,但有数万个依赖项文件,这个依赖项集合与编译大致相同! (等待太长了:)) 有没有更快的方法来获取单个文件中的所有依赖项? 如果这很重要,那就是ANSI C,GCC和Linux。 提前致谢。

GCC内联汇编’Nd’约束

我正在用C开发一个小玩具内核。我需要从键盘获取用户输入。 到目前为止,我已使用以下代码实现了inb : static inline uint8_t inb(uint16_t port) { uint8_t ret; asm volatile(“inb %1, %0” : “=a”(ret) : “Nd”(port)); return ret; } 我知道”=a”约束意味着al/ax/eax将被复制到ret作为输出,但我仍然对”Nd”约束感到困惑。 任何人都能提供一些有关为什么需要这种约束的见解? 或者为什么我不能只使用像”r”或”b”这样的通用寄存器约束? 任何帮助,将不胜感激。

什么时候我们应该使用RTLD_DEEPBIND?

我正在尝试链接中提到的问题: https : //sourceware.org/ml/libc-alpha/2009-06/msg00168.html 我在代码中做了一些修改,如下所述: >> Cat libdep.c #include int duplicate = ‘u’; int get_duplicate() { printf(“libdep sees duplicate as: %c\n”, duplicate); printf(“libdep sees duplicate address as: %x\n”, &duplicate); return duplicate; } ————————————————————————————– >> Cat dynamic.c #include extern int duplicate; int run() { duplicate = ‘d’; printf(“dynamic sees duplicate from libdep as: %c\n”, duplicate); printf(“dynamic […]

如何将C ++静态库链接到C程序?

我有以下c ++程序: Client.h #ifndef Client_Client_h #define Client_Client_h #include “Client.h” class Client { public: void f1(); void f2(); }; #endif Client.cpp #include #include using namespace std; #include “Client.h” void Client::f1(){ cout << "Client.f1()" << endl; } void Client::f2() { cout << "Client.f2()" << endl; } 在XCode 4.3中编译上面的内容给我一个名为的静态库文件: libClient.a 另外,我有一个main.c #include // //using namespace std; int main(){ […]

声明具有存储类说明符但没有类型说明符的变量是什么意思?

阅读ANSI C Yacc语法规范后,我注意到以下内容都是有效的: register x; auto y; static z; extern q; 这对我来说似乎很奇怪,因为我对类型的理解表明这些变量都没有类型。 这些是什么意思? 他们如何打字? 分配了多少内存?

奇怪的C ++模板问题

所以基本上我们必须创建一个双向链接列表,这个列表一般是模板化的,而不是锁定到单个数据类型。 我已经尝试使用gcc和msvc进行编译,两个编译器都给了我大致相同的错误,所以我假设它只是我的错误编码,而不是一个编译器或另一个编译器的古怪。 目前,我收到错误,说我在linkList.h中的类不是模板 ../linkList.h:34:错误:’llist’不是模板类型 ../linkList.h:143:错误:’iter’不是模板类型 ../josephus.cpp:14:错误:’llist’不是模板 ../josephus.cpp:14:错误:聚合’llist ppl’的类型不完整,无法定义 ../josephus.cpp:15:错误:’iter’不是模板 linkList.h template class iter { public: iter() { position = sentin; container = sentin->payload; } T get() const { assert(position != sentin); return position->payload; } void next() { position = position->next; } void previous() { position = position->prev; } bool equals(iter itr) const { return position […]

尝试在C中使指针无效时的Segfault

所以现在我正在尝试实现一个deltaclock,我正在尝试的第一步是首先创建一个使用双链表的优先级队列(我稍后会做其他deltaclock的事情)。 从优先级队列中弹出的第一个元素是位于链表(或deltaClock结构)根目录的元素。 我在测试中将几个元素推送到队列中,并且在一些弹出操作之后,有一个案例,当它从几乎空的列表中弹出时会出现段错误。 当我在弹出方法中注释掉行中我说“clock-> root-> previous = 0;”时,当我弹出元素时,main方法中的程序不会出现段错误。 但是,由于前一个节点不再存在,因此需要删除指向前一个节点的指针。 当我执行pop操作时,如何才能使新root的前一个指针为null? #include #include struct deltaNode{ int tics; // source struct deltaNode* next; struct deltaNode* previous; }; struct deltaClock{ struct deltaNode* root; struct deltaNode* tail; int size; }; void initDeltaClock(struct deltaClock **clock){ (*clock) = malloc(sizeof(struct deltaClock)); (*clock)->size = 0; } void push(struct deltaClock* clock, int numberOfTics){ if(clock->root […]