Tag: 编译器警告

C返回char 警告“返回局部变量的地址”

这是家庭作业的一部分。 我试图在我的方法getLine中读取并返回一行文件。 char *getLine(FILE *input) { char line[30]; if(fgets(line, sizeof(line), input)!=NULL) { return line; }else{ return NULL; } } 这似乎与我所教的关于指针的工作有关,但是我无法删除警告消息warning: function returns address of local variable [enabled by default] 。 该警告是指线路return line; 。 我的作业要求编译时没有警告或错误。 我不明白我做错了什么。 我发现的大多数帮助建议为文本行提供malloc-ing空间,但是我们还没有在课堂上讨论过这个问题,即使我已经在另一个类中完成了一些操作。 这真的是最好的方法吗? 如果是这样,我可以在该计划的任何地方免费吗?

为什么gcc报告“隐含的函数声明’轮”?

我有以下C代码: #include int main(int argc, char ** argv) { double mydouble = 100.0; double whatever = round(mydouble); return (int) whatever; } 当我编译它时,我收到警告: round_test.c: In function ‘main’: round_test.c:6: warning: implicit declaration of function ’round’ round_test.c:6: warning: incompatible implicit declaration of built-in function ’round’ 我对C生锈了,但我认为#include将round()的声明带入了范围。 我检查了我的ANSI标准(C99是我唯一的副本),它确认了math.h标头中存在round()函数。 我在这里想念的是什么? 编辑:编译器是Ubuntu上的GCC 4.3.2(intrepid,IIRC)。 运行gcc -E给出: $ gcc -E round_test.c | grep […]

‘noreturn’function确实会回归

当我编译下面的C程序时,我收到这个警告: ‘noreturn’ function does return 。 这是function: void hello(void){ int i; i=1; } 为什么会这样? 对此函数的所有调用都是hello(); 编辑:完整的错误输出: home.c: In function ‘hello’: hhme.c:838:7: error: variable ‘i’ set but not used [-Werror=unused-but-set-variable] home.c:840:1: error: ‘noreturn’ function does return [-Werror] cc1: all warnings being treated as errors make: *** [home.o] Error 1

赋值 = :不兼容的指针

当我编译这样的东西 double da[ 3 ] = { 2., 3., 4. }; double (* pda)[ 3 ] = &da; double const (* cpda)[ 3 ] = pda; // gcc: warning; MSVC: ok gcc警告我 warning: initialization from incompatible pointer type [enabled by default] 问题:这项任务有什么问题? 是的,从技术上讲,这些是不同的类型,但我没有看到任何危险, double const (*)[ 3 ]看起来比double (*)[ 3 ]更安全。 我做了一些测试,结果让我更加困惑: 1)MSVC非常满意double const (* […]

如何安静C编译器关于函数指针需要任意数量的参数?

我在一个struct中有一个函数指针,它在运行时动态设置为我代码中不同位置的另一个函数的地址。 它在我的头文件中定义如下: void *(*run)(); 在编译期间,我收到以下关于此的警告: warning: function declaration isn’t a prototype 这个警告是良性的,因为指针在我的代码中的许多地方用来调用它指向的函数,一切正常。 但是,我真的想要保持警告。 如果我改成它: void *(*run)(void); 我使用它时会遇到编译错误,因为使用指针的各种函数具有不同数量的参数,并且在括号内表示void告诉编译器它不接受任何参数。 我不能使用va_list或类似的任何东西,因为这只是指向另一个函数的指针,我使用单个指针,因为它保持代码干净和简单。 我可以通过将此添加到我的编译器标志来使警告静音: -Wno-strict-prototypes 但是如果我能避免它,我宁愿不用标志来禁用编译器警告。 所以我的问题是: 我如何在代码中注释这个函数指针,使编译器满意它接受任意数量的任何类型的参数这一事实? 代码完美无缺。 我只想让警告消失。

为什么这个“隐含声明函数’X’”?

我写了一个简单的程序来查找3个数字的Sum,average,maximum和最小数。 它允许用户输入三个(整数)数字并返回总和,平均值,最大值和最小值。 它没有错误,只有警告。 这是我的源代码: main.c中: #include int main() { int num1, num2, num3, sum, max, min, avg; printf(“Enter Three \”Integer\” Numbers:”); scanf(“%i%i%i”, &num1, &num2, &num3); sum = summation(&num1, &num2, &num3); avg = average(&sum); max = max_val(&num1, &num2, &num3); min = min_val(&num1, &num2, &num3); printf(“Sum: %i Avg: %i MAX: %i MIN: %i”, sum, avg, max, min); […]

数组下标的类型为’char’

我有以下代码从命令行读取参数。 如果字符串长度为1个字符,并且我想将其用作退出值。 编译器在第二行给出了警告(数组下标的类型为’char’)此错误来自“&&”之后的第二部分。 if (args[1] != NULL) { if ((strlen(args[1]) == 1) && isdigit(*args[1])) exit(((int) args[1][0])); else exit(0); } } 此外,当我使用不同的编译器时,我在下一行(退出)上得到两个错误。 builtin.c: In function ‘builtin_command’: builtin.c:55: warning: implicit declaration of function ‘exit’ builtin.c:55: warning: incompatible implicit declaration of built-in function ‘exit’

混合声明和代码

当我使用“gcc -o dene -Wall -ansi -pedantic-errors dene.c”编译函数时,gcc不会发出任何错误。(你可以看一下以char开头的行,在if循环中) static void remove_negation(char *s,char *s1) { char **cmainp=malloc(sizeof(char*)*1); int len=0;int d=0; int i=0; cmainp[0]=malloc(sizeof(char)*300); len=strlen(s); for(i=0;i<len;++i) { if(s[i]=='-') if(i==0 || s[i-1]==',') /*look*/ {char *p=malloc(sizeof(char)*3); /*look*/ ++i; p[0]=s[i]; p[1]='\0'; strcat(s1,","); strcat(s1,p); free(p); continue; } cmainp[0][d]=s[i]; ++d; } cmainp[0][d+1]='\0'; strcpy(cmainp[0],s); free(cmainp[0]); } 但是,当编译上面的函数用gcc重新格式化时,gcc会发出该错误; “dene.c:10:错误:ISO C90禁止混合声明和代码” static void remove_negation(char *s,char *s1) […]

为什么我在这个琐碎的例子中没有得到gcc的“未使用的未初始化”警告?

如何在序列反转程序中修复此分段错误再次出现了一个愚蠢的未初始化变量错误? 。 所以我打算重复“请使用-Wall flags”评论,但是当我测试代码反对警告时,我发现没有任何警告报告给我的惊喜。 所以我把它修改为下面这个(这段代码对于执行目的毫无意义,但它说明了我想要展示的内容): #include int main() { int i,len=12; /* printf(“%d\n”,i); */ while(i!=len-1) { i++; len–; } return 0; } 使用gcc 4.7.3和6.2.1编译时 gcc -Wall -Wextra -pedantic 我没有得到任何警告,而在使用while循环之前, i公然没有初始化。 现在,如果我取消注释printf语句,我得到: warning: ‘i’ is used uninitialized in this function [-Wuninitialized] 那么为什么在将i传递给printf而不是在while测试时发出警告? (不同的gcc没有警告未初始化的变量,因为在我的情况下,没有分支) (听起来像一个小虫,但它是如此微不足道,我想知道我是不是错过了一些巨大的东西。)

通用编译器独立的方式在C / C ++中实现UNUSED宏

在实现存根等时,您希望避免使用“未使用的变量”警告。 多年来,我遇到过UNUSED()宏的一些替代方案,但从来没有一个被certificate适用于“所有”编译器,或者标准是气密的。 或者我们是否坚持使用每个构建平台的#ifdef块? 编辑:由于非c兼容替代品的答案很多,我想澄清我正在寻找一个对C和C ++,所有口味等都有效的定义。