Tag: gcc

警告:无符号表达式的比较> = 0始终为true

编译C文件时出现以下错误: t_memmove.c: In function ‘ft_memmove’: ft_memmove.c:19: warning: comparison of unsigned expression >= 0 is always true 这是完整的代码,来自cat ft_memmove.c : #include “libft.h” #include void *ft_memmove(void *s1, const void *s2, size_t n) { char *s1c; char *s2c; size_t i; if (!s1 || !s2 || !n) { return s1; } i = 0; s1c = (char *) s1; […]

获取sin()的值时生成错误

我最近开始学习C作为辅助项目。 我在OpenSuse下使用最新的NetBeans工作,使用GCC作为编译工具集。 我做的第一个程序之一是: #include #include #include /* * */ int main(int argc, char** argv) { double rad = 1; double result = 0; result = sin(rad); return (EXIT_SUCCESS); } 这是一个简单,明智的例子,应该没有问题。 但是,在尝试编译时,我得到一个构建错误:退出代码2(第18行中的错误,对sin的未定义引用)。 有趣的是,如果我删除sin(rad)值的赋值结果OR用硬编码值替换rad,程序编译就好了。 我在这做错了什么?

为什么编译器在编译的汇编代码中生成额外的sqrts

我正在尝试使用以下简单的C代码来分析计算sqrt所需的时间,其中readTSC()是一个读取CPU循环计数器的函数。 double sum = 0.0; int i; tm = readTSC(); for ( i = 0; i < n; i++ ) sum += sqrt((double) i); tm = readTSC() – tm; printf("%lld clocks in total\n",tm); printf("%15.6e\n",sum); 但是,当我使用打印出汇编代码时 gcc -S timing.c -o timing.s 在英特尔机器上,结果(如下所示)令人惊讶? 为什么汇编代码中有两个sqrts,一个使用sqrtsd指令而另一个使用函数调用? 它是否与循环展开和尝试在一次迭代中执行两个sqrts相关? 以及如何理解这条线 ucomisd %xmm0, %xmm0 为什么将%xmm0与自身进行比较? //—————-start of for loop—————- call readTSC movq […]

如果条件出现故障,请在里面进行字符串比较

我试图用C编程,但并不成功。 我有一个简单的源代码,我需要匹配if (char)中的多个字母。 它显示以下错误消息(在使用gcc的linux终端中): main.c:在函数`main’中:main.c:16:23:warning:字符常量对于它的类型太长[默认启用] if(firstName [20] ==’Vojta’){ 源代码: #include int main(int argc, char const *argv[]) { /* code */ char firstName[20]; char lastName[40]; char password[20]; char confpasswd[20]; int age; printf(“Please write your first and last name:”); scanf(“%s%s”, firstName, lastName); printf(“%s %s:\n”, firstName, lastName); if (firstName[20] == ‘Vojta’){ printf(“\ncool\n”); } return 0; }

不包括stdlib.h不会产生任何编译错误!

希望这是一个非常简单的问题。 以下是我的C pgm(test.c)。 #include //#include int main (int argc, char *argv[]) { int intValue = atoi(“1”); double doubleValue = atof(“2″); fprintf(stdout,”The intValue is %d and the doubleValue is %g\n”, intValue, doubleValue); return 0; } 请注意,我正在使用stdlib.h中的atoi()和atof(),但我没有包含该头文件。 我编译pgm(gcc test.c)并且没有编译错误! 我运行pgm(./a.out),这是输出,这是错误的。 The intValue is 1 and the doubleValue is 0 现在我包含stdlib.h(通过删除#include之前的注释)并重新编译它并再次运行它。 这次我得到了正确的输出: The intValue is 1 and the […]

LTO for gcc或clang可以跨C和C ++方法进行优化

如果链接时优化(LTO)与gcc或clang一起使用 ,是否可以跨C和C ++语言边界优化代码? 例如,C函数可以内联到C ++调用者中吗?

是不是有语法错误? 应该是printf(“一个”,两个和“”%s。\ n“,”三个“); 是有效的代码?

看看这段代码: #include #define _ONE “one” #define _TWO_AND “, two and ” int main() { const char THREE[6] = “three” ; printf(_ONE _TWO_AND “%s.\n”, THREE ); return 0; } printf有效: printf(“one” “, two and ” “%s.\n”, “three” ); 输出是: 一,二,三。 编译此代码后, gcc既没有错误也没有警告消息。 gcc编译器是否应该以这种方式工作,还是一个bug?

为什么GCC 4.8.2抱怨在严格溢出下添加?

考虑这段代码( bits.c ): #include #include #include static uint64_t pick_bits(unsigned char *bytes, size_t nbytes, int lo, int hi) { assert(bytes != 0 && nbytes > 0 && nbytes = 0 && lo = 0 && hi = lo); uint64_t result = 0; for (int i = nbytes – 1; i >= 0; i–) result = (result […]

在R中抑制C警告消息

我从R包e1071调用一个R函数,它与libsvm(一个C程序)接口。 此函数将C(printf)警告消息传递给R控制台。 我知道这是因为警告消息的forms(警告:……)而R警告消息是大写的(即警告:……)。 我已经尝试了一切来摆脱R中的这些消息(下沉,抑制警告,看不见),但似乎没有任何效果。 有任何想法吗? 谢谢!

展开循环并使用矢量化进行独立求和

对于以下循环,如果我告诉它使用关联数学,例如使用-Ofast GCC将仅对循环进行矢量化。 float sumf(float *x) { x = (float*)__builtin_assume_aligned(x, 64); float sum = 0; for(int i=0; i<2048; i++) sum += x[i]; return sum; } 这是带-Ofast -mavx的程序集 sumf(float*): vxorps %xmm0, %xmm0, %xmm0 leaq 8192(%rdi), %rax .L2: vaddps (%rdi), %ymm0, %ymm0 addq $32, %rdi cmpq %rdi, %rax jne .L2 vhaddps %ymm0, %ymm0, %ymm0 vhaddps %ymm0, %ymm0, %ymm1 […]