当使用C的GCC向量扩展时,如何检查向量上的所有值是否为零? 例如: #include typedef uint32_t v8ui __attribute__ ((vector_size (32))); v8ui* foo(v8ui *mem) { v8ui v; for ( v = (v8ui){ 1, 1, 1, 1, 1, 1, 1, 1 }; v[0] || v[1] || v[2] || v[3] || v[4] || v[5] || v[6] || v[7]; mem++) v &= *(mem); return mem; } SSE4.2具有PTEST指令,允许运行类似于for条件的测试for但GCC生成的代码只是解包向量并逐个检查单个元素: .L2: vandps (%rax), […]
如何设置(以最优雅的方式) uint32_t最低有效位? 那就是写一个函数void setbits(uint32_t *x, int n); 。 函数应该处理从0到32每个n 。 特别是应该处理n==32值。
可以使用.specs文件将gcc驱动程序配置为使用特定链接器,特定选项和其他详细信息(例如,覆盖系统头)。 GCC版本(4.9.0)的当前(在撰写本文时)手册中描述了Spec Files 。 Clang / LLVM是否有类似的机制。 显然,Clang也有驱动程序的概念 ,但我无法提供有关Clang是否存在Spec Files或类似机制以及如何使用它们的任何文档。 我对C和C ++感兴趣,但是可能指向其中任何一个的指针都会让我开始。 目标是覆盖系统头和库路径以及前面简要提到的链接器。
我遇到了一个看起来像这样的代码: asm volatile ( # […] “movl $1200, %%ecx;” # […] ); 我知道什么是movl $1200, %ecx在x86中做了什么。 但我很困惑为什么有两个百分号。
经过多年的编程,我正在修课。 我的导师没有使用POSIX机器,最近我因在作业中使用indexfunction而受到惩罚。 我做了一些研究,我注意到虽然index是AT&T Unix的早期部分,并且符合POSIX标准,但它不是C99标准的一部分。 我希望gcc帮我找到类似符号的用法 。 我正在使用gcc 4.2( 不是 llvm)在OSX上编译 我的第一站研究涉及注意我的string.h文件在下面的特征测试宏检查中包装index的原型: #if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) 经过一番挖掘,我发现了这个(在我的/usr/include/sys/cdefs.h ): /* STRICT Defining _POSIX_C_SOURCE or _XOPEN_SOURCE restricts the * available APIs to exactly the set of APIs defined by the * corresponding standard, based on the value defined. * * A correct, portable definition for _POSIX_C_SOURCE is 200112L. […]
我最近在笔记本电脑上设置了MinGW + MSYS环境,以检查Netbeans C / C ++支持的情况。 一切似乎都运行良好,但是,在我的测试中,我注意到GCC和Microsoft的cl.exe编译器之间存在差异。 这是一个示例程序: #include #include #include int main(void) { int i_max = INT_MAX; char c_max = CHAR_MAX, c; c = i_max; printf(“i_max: %d, c_max: %d, c: %d\n”, i_max, c_max, c); return EXIT_SUCCESS; } 输出是: i_max: 2147483647, c_max: 127, c: -1 正如您在上面的代码中看到的,我将一个int分配给一个char。 这不应该产生可能发生数据丢失的警告吗? 微软的编译器(我配置得非常严格)会发出警告而GCC没有。 以下是我使用的GCC选项: -g -Werror -ansi -pedantic -Wall […]
我正在尝试学习assembly如何在初级阶段工作,所以我一直在玩gcc汇编的-S输出。 我写了一个简单的程序,定义了两个字节并返回它们的总和。 整个计划如下: int main(void) { char A = 5; char B = 10; return A + B; } 当我使用以下方法编译时没有优化: gcc -O0 -S -c test.c 我得到test.s,如下所示: .file “test.c” .def ___main; .scl 2; .type 32; .endef .text .globl _main .def _main; .scl 2; .type 32; .endef _main: LFB0: .cfi_startproc pushl %ebp .cfi_def_cfa_offset 8 .cfi_offset 5, -8 […]
我已经安装了Eclipse Neon(v4.6)。 另外,我有“在Windows上使用Ubuntu进行Bash”(2016年9月)。 我安装了gcc和gdb用于在C中进行编译和调试。我在终端上测试了它们并且它们正在运行。 我正在尝试使用Eclipse来创建一个新的C项目,但是在编译器选择阶段,它并没有让我选择使用“Windows上的Bash on Ubuntu”编译器。 有什么方法可以解决我的问题吗?
我看过这些,他们没有回答我的问题: 可能无法初始化可变大小的对象 C编译错误:“可能无法初始化可变大小的对象” 错误:可能无法初始化可变大小的对象。 但为什么? 我正在尝试编写一些相当便携的c代码: int main () { const int foo=13; int bar[foo]={0}; return 0; } 当使用以下任一方法编译为c代码时,我得到一个variable-sized object may not be initialized错误: gcc 4.3.4 arm-linux-gnueabi-gcc 4.4.5 如果我在VS2008中将其编译为c ,我会得到一个稍微不同的error C2057: expected constant expression 我明白在这里, c代码编译器无法识别const int foo=13; 真实地保持不变; 例如我们可能有 void a(int fool) { const int foo=fool; int bar[foo]={0}; } 我也意识到, 与gcc编译器不同 , VS2008编译器没有C99可变长度数组的概念。 那个MS显然没有提到任何未来的支持。 […]
我有一些代码在GCC 4.8.4下编译得很好。 我最近升级了我的系统,现在有GCC 5.2.1,我收到有关不兼容指针类型的警告。 我已经将问题提取到一个重现错误的小例子: typedef const double ConstSpiceDouble; void foo(const double (*)[3]); int main(int argc, char **argv) { double a[3][3] = {{1,2,3},{1,2,3},{1,2,3}}; foo((ConstSpiceDouble (*)[3])a); return 0; } 在实际代码中,typedef,函数定义和类型转换都在我控制之外的库中,否则我只需修复转换和匹配的函数。 这是我从编译器得到的消息: $ gcc -Werror -c test.c test.c: In function ‘main’: test.c:9:7: error: passing argument 1 of ‘foo’ from incompatible pointer type [-Werror=incompatible-pointer-types] foo((ConstSpiceDouble (*)[3])a); ^ test.c:4:6: […]