Tag: 警告

printf / sprintf编译器警告是否有概念上的突破?

我注意到,当printf / sprintf函数的格式字符串中的转换说明符与相应参数的类型或计数不匹配时,大量C编译器会发出警告。 在我看来,这似乎是一个概念上的突破,因为根据语言规范,C没有内置函数。 所有编译器都应该知道printf / sprintf是他们的原型而不是他们的语义。 我知道printf / sprintf是标准的C函数,但是它们存在于一个单独的库libc中,你必须包含stdio.h才能导入它们的原型。 许多编译器所做的是分析格式字符串,该格式字符串也可以在运行时提供。 以上是否有意义?

GCC,C:找出在#pragma ignore中使用的默认警告的名称

我知道我可以放 #pragma GCC diagnostic ignored “” 到源文件的顶部以禁止与此特定源文件相关的警告。 但是,似乎有些名称不够具体。 例如, #pragma GCC diagnostic ignored “-Wwrite-strings” 不会阻止gcc(4.7.2)显示未给出确切名称的警告消息,相反,这些消息仅遵循[默认启用]。 我想我需要知道正确的警告名称,以便我可以在#pragma行中使用它们。 我试过了 -fdiagnostics-show-option, 但警告仍显示为[默认启用]。 有没有办法识别这些警告或者替代地抑制与特定源文件相关的警告? 非常感谢你!

我应该禁用C编译器签名/未签名的不匹配警告吗?

当您尝试比较两个变量时,Microsoft C编译器会发出警告,其中一个是有符号的,另一个是无符号的。 例如: int a; unsigned b; if ( a < b ) { // warning C4018: '<' : signed/unsigned mismatch } 在世界历史上,这个警告是否曾经发现过一个真正的错误? 无论如何,为什么呢?

声明没有声明任何内容:警告?

#include #include #include int main() { struct emp { struct address { int a; }; struct address a1; }; } 此代码显示警告: – 警告:声明不声明任何内容(默认情况下启用) 以下代码显示没有警告的位置 #include #include #include int main() { struct emp { struct address { int a; }a1; }; } 为什么’警告’仅显示在第一个代码中?

这些破坏性变量警告有何意义?

我有这样的function: #include jmp_buf buf; void func2(int g); extern int some_global; void func(int x) { if (setjmp(buf)) return; if (some_global) x += 5; func2(x); } GCC(gcc(Debian 4.4.5-8)4.4.5)发出警告: test.c:在函数’func’中: test.c:5:警告:参数’x’可能被’longjmp’或’vfork’破坏[-Wclobbered] 为什么???? 我的意思是,显然我不在乎x是否被破坏,因为它在setjmp返回后不可能被使用。 即使编译器应该知道一些非常明显的东西,因为它具有某种特殊的setjmp知识。 我的主要兴趣是找到我inheritance的代码库中的错误,因此,“使用这种编码风格代替”并不是我正在寻找的建议。 然而,这里有许多奇怪的曲折。 例如,如果x是局部变量而不是参数,那么GCC不会抱怨。 此外, if (some_global)没有if (some_global)行,GCC不会抱怨。 尼斯。 有些事情搞砸了GCC的流量分析,或者GCC知道我不知道的事情。 所以, 是否有一种简单的方法来抑制此函数的此警告,就像将未使用的参数转换为(void) ? 或者我只是在项目范围内禁止警告? 或者我错过了什么? 更新:让我与您分享一个不会产生警告的略有不同的版本: #include jmp_buf buf; void func2(int g); extern int some_global; […]

C指针和数组:赋值使得整数指针没有强制转换

我在使用C中的指针和数组时遇到了一些问题。这是代码: #include int *ap; int a[5]={41,42,43,44,45}; int x; int main() { ap = a[4]; x = *ap; printf(“%d”,x); return 0; } 当我编译并运行代码时,我收到此警告: [警告]赋值使得整数指针没有强制转换[默认启用] 对于第9行(ap = a [4];)并且终端崩溃。 如果我将第9行更改为不包含某个位置(ap = a;),我不会收到任何警告并且它有效。 为什么会这样? 我觉得答案很明显,但我看不出来。

警告:在此function中可以使用未初始化的X.

我正在编写一个自定义的“矢量”结构。 我不明白为什么我会收到Warning: “one” may be used uninitialized在这里Warning: “one” may be used uninitialized 。 这是我的vector.h文件 #ifndef VECTOR_H #define VECTOR_H typedef struct Vector{ int a; int b; int c; }Vector; #endif /* VECTOR_ */ 警告发生在第一行one->a = 12 #include #include #include #include “vector.h” int main(void){ Vector* one; one->a = 12; one->b = 13; one->c = -11; }

警告:C中指针和整数之间的比较

我收到警告 warning: comparison between pointer and integer 在包含if下一段代码的行上: char cwd[1024]; if (getcwd(cwd, sizeof(cwd)) != (char*)NULL) printf(“%s\n”,cwd); else error_print(“error in pwd”); 我需要修复的方式和内容?

23警告:赋值使得整数指针没有强制转换

我是编程c的新手,带有数组和文件。 我只是试图运行以下代码,但我得到这样的警告: 23 44警告:赋值使用整数而不使用强制转换 53错误:’char’之前的预期表达式 有帮助吗? 这可能很傻……但是我找不到什么是错的。 #include FILE *fp; FILE *cw; char filename_game[40],filename_words[40]; int main() { while(1) { /* Input filenames. */ printf(“\n Enter the name of the file \n”); gets(filename_game); printf(“\n Give the name of the file2 \n”); gets(filename_words); /* Try to open the file with the game */ fp=fopen(/* args omitted */); […]

警告:内置函数’strlen’和’strcpy’不兼容的隐式声明

我刚刚完成了我的刽子手游戏,作为最后一步,我正在进行一些代码清理和优化,但我似乎无法理解为什么我会收到以下两个警告: 警告:内置函数’strlen’的不兼容隐式声明 警告:内置函数’strcpy’的不兼容隐式声明 使用它们的代码在这里: for(i = 1; i <= random; i++) fgets(word, 100, f); fclose(f); for(i = 0; i < strlen(word); i++) if(word[i] == '\n') word[strlen(word)-1] = '\0'; lungime = strlen(word); strcpy(word2, word); 我所做的是使用fgets从文件中读取随机单词。 在此之后,我删除了fgets自动放置的’\ n’。 最后,我在word2中复制了这个单词。 二手图书馆: #include #include #include 变量声明: int random, n = 0, i, j, lengh, tries = 5, ok = […]