Tag: gcc

解除引用类型惩罚指针将破坏严格别名规则

我有一个包含结构的unsigned char指针。现在我想要执行以下操作 unsigned char buffer[24]; //code to fill the buffer with the relevant information. int len = ntohs((record_t*)buffer->len); 其中record_t结构包含一个名为len的字段。我无法这样做并且收到错误。 error: request for member ‘len’ in something not a structure or union. 然后我尝试了: int len = ntohs(((record_t*)buffer)->len); 这样才能使操作员优先。 这给了我warning: dereferencing type-punned pointer will break strict-aliasing rules 。 然后我宣布 record_t *rec = null; rec = (record_t*) 我在这做错了什么?

为什么getline的第一个参数指向指针“char **”而不是“char *”?

我使用getline函数从STDIN读取一行。 getline的原型是: ssize_t getline(char **lineptr, size_t *n, FILE *stream); 我将此作为测试程序使用,该程序来自http://www.crasseux.com/books/ctutorial/getline.html#getline #include #include #include int main(int atgc, char *argv[]) { int bytes_read = 1; int nbytes = 10; char *my_string; my_string = (char *)malloc(nbytes+1); puts(“Please enter a line of text”); bytes_read = getline(&my_string, &nbytes, stdin); if (bytes_read == -1) { puts (“ERROR!”); } else { puts […]

变量宏,零参数

我正在研究一个调用宏, #define CALL(f,…) FN(f)->call((ref(new LinkedList()), __VA_ARGS__)) 什么时候叫, CALL(print,2,3,4,5); 将2 3 4 5添加到链接列表(,重载以执行此操作)并调用print,其中需要一个按预期工作的链表,但是有些调用不需要参数, CALL(HeapSize); 它仍然需要一个链接列表,但是空的一个,上面不起作用,我试图想出一个可以使用任何一种风格的宏吗? 编辑:挖掘gcc文档我发现在VA_ARGS之前添加##会删除,当没有参数但是我无法嵌套宏时, CALL(print,CALL(HeadSize)); 这会导致CALL未定义错误,如果我分离它的工作调用

OS X Yosemite中的gcc 4.9.1 – gcc:警告:无法理解kern.osversion ’14 .0.0′

我安装OS X Yosemite,现在我对gcc 4.9.1编译器有一个很大的问题。 我希望有人可以帮助我。 我尝试编译我的程序,我有警告消息: gcc: warning: couldn’t understand kern.osversion ‘14.0.0’ 我搜索谷歌,我发现https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61407我尝试应用补丁: sudo patch -p1 < /usr/local/bin/00-darwin-10.10.patch 在gcc文件夹中: /usr/local/bin/gcc我收到了以下消息: can’t find file to patch at input line 5 Perhaps you used the wrong -p or –strip option? The text leading up to this was: ————————– |diff –git a/fixincludes/fixincl.xb/fixincludes/fixincl.x |index dd45802..0db14d7 100644 |— a/fixincludes/fixincl.x |+++ […]

是否有离线的MinGW安装程序?

我正在学习C,我想在笔记本电脑上安装MinGW。 MinGW安装程序是一个Web安装程序 ,它要求计算机在安装时可以访问Internet。 但问题是我的电脑没有连接到互联网。 所以它无法安装。 所以我想在我的智能手机上下载完整的离线安装程序,并通过蓝牙将其转移到我的电脑上。 我已经尝试过TDM-GCC,但即使这样也需要我下载一些东西。 那么MinGW有离线安装程序吗? 如果是,我在哪里可以得到它?

有没有办法让gcc或clang警告显式演员表?

我想要做的是找到所有显式的强制转换,从double类型或float到我拥有的一些源文件中的任何其他类型。 有没有内置的gcc方法来做到这一点? 语言是C.谢谢!

为什么gcc允许类型为void(非指针)的extern声明?

为什么gcc允许类型为void的extern声明? 这是扩展还是标准C? 这有可接受的用途吗? 我猜这是一个扩展,但我没有发现它提到: http://gcc.gnu.org/onlinedocs/gcc-4.3.6/gcc/C-Extensions.html $ cat extern_void.c extern void foo; /* ok in gcc 4.3, not ok in Visual Studio 2008 */ void* get_foo_ptr(void) { return &foo; } $ gcc -c extern_void.c # no compile error $ gcc –version | head -n 1 gcc (Debian 4.3.2-1.1) 4.3.2 将foo定义为void类型当然是编译错误: $ gcc -c -Dextern= extern_void.c extern_void.c:1: […]

GCC:严格别名警告的准确性

我正在尝试检查我的一些代码是否存在严格的别名违规,但在尝试理解严格的别名规则时,我似乎错过了一些东西。 想象一下以下代码: #include int main( void ) { unsigned long l; l = 0; *( ( unsigned short * )&l ) = 1; printf( “%lu\n”, l ); return 0; } 经典和基本的例子。 使用GCC 4.9( -Wall -fstrict-aliasing -Wstrict-aliasing -O3 ),它实际报告错误: dereferencing type-punned pointer will break strict-aliasing rules 但以下编译很好: #include int main( void ) { unsigned long l; […]

如何让GCC为没有内置的大端存储生成bswap指令?

我正在研究一个以大端格式将64位值存储到内存中的函数。 我希望我能编写可在小端和大端平台上运行的可移植C99代码,并让现代x86编译器自动生成bswap指令而不需要任何内置函数或内在函数 。 所以我开始使用以下function: #include void encode_bigend_u64(uint64_t value, void *vdest) { uint64_t bigend; uint8_t *bytes = (uint8_t*)&bigend; bytes[0] = value >> 56; bytes[1] = value >> 48; bytes[2] = value >> 40; bytes[3] = value >> 32; bytes[4] = value >> 24; bytes[5] = value >> 16; bytes[6] = value >> 8; bytes[7] = value; […]

如何让`gcc`从标准C生成x86-64的`bts`指令?

受最近一个问题的启发,我想知道是否有人知道如何让gcc在Linux x86-64平台上生成x86-64 bts指令(位测试和设置), 而无需求助于内联汇编或非标准编译器内部函数。 相关问题: 为什么gcc没有为简单的|=操作执行此操作,右侧是否正好设置了1位? 如何使用编译器内在函数或asm指令获取bts 可移植性对我来说比bts更重要,所以我不会使用和asm指令,如果有另一个解决方案,我宁愿不使用编译器instrinsics。 编辑 :C源语言不支持primefaces操作,所以我对获得primefaces测试和设置并不特别感兴趣(尽管这是测试和设置首先存在的原始原因)。 如果我想要一些primefaces,我知道我没有机会使用标准C源:它必须是内在的,库函数或内联汇编。 (我在支持multithreading的编译器中实现了primefaces操作。)