如何删除C中的警告?

时间:2015-01-06 18:30:55

标签: c

我在C中编写程序并且它没有显示任何错误,但它有一些警告,我无法找到如何修复。

首先工作是

  

printf使用%d并期望 int 参数,但 pos long int

printf("Kernel load error: kernel %s is smaller then 11000 bytes. %d bytes loaded total.\n",files[count].name,pos);

第二是

  

函数'mkdir'[-Wimplicit-function-declaration] |

的隐式声明
mkdir("kernels");

类似的问题,这缩短了:

char * path = "kernels";
buildKernels(&path, files, count, &binariesSizeTotal);

实现:

bool buildKernels(char ** path,FILES * files, int count ){
  strlen(path);
...
}

内置函数'strlen'的不兼容隐式声明[默认启用] |

另外两个:

  

*函数'buildKernels'的隐式声明[-Wimplicit-function-declaration] |

     

函数'loadKernels'的隐式声明[-Wimplicit-function-declaration] | *

这两个函数都在头文件中声明。我不确定“隐含声明”是什么意思。编译器对我的期望是什么?如何解决这些错误?

我没有成功解决的最后一个问题:

while( token != NULL )
   {
      printf( " %s\n", token );
      token = strtok(NULL, s); // char *strtok(char *str, const char *delim)
   }

这给了我警告警告:

  

指针和整数之间的比较[默认启用] |

1 个答案:

答案 0 :(得分:1)

对变量%ld使用格式说明符pos

包含声明函数mkdirbuildKernels的标头,或者至少在调用之前包含声明。

还要考虑使用四个参数调用函数buildKernels

char * path = "kernels";
buildKernels(&path, files, count, &binariesSizeTotal);

但是用三个参数进行了打击

bool buildKernels(char ** path,FILES * files, int count ){
...
}

所以这可能是错误的原因。

功能strlen。在传递类型为const char *

的参数时,需要一个类型为char **的参数
bool buildKernels(char ** path,FILES * files, int count ){
strlen(path);

将参数path声明为类型char *或正确调用函数strlen,如

strlen( *path );

至于最后一个警告,如果令牌是一个指针,那么代码是有效的。您应该显示完整的警告消息。或者,NULL可以用C ++样式而不是C样式定义。你不应该自己定义NULL。