在Ubuntu 10.04.2 x86_64上使用gcc 4.4.3进行编译我收到以下警告:
warning: comparison between pointer and integer
这一行:
if (strptime(date_time, "%d-%b-%y %T", &tm) == NULL) {
如果我将NULL更改为0,则警告消失。但是strptime的手册页声明它在出错时返回NULL。我在上一行添加了<time.h>
和#define __USE_XOPEN 1
。我也试过#define _XOPEN_SOURCE
。
感谢您的时间。
修改
完整包括:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#define __USE_XOPEN 1 /* needed for strptime */
#include <time.h>
#include <arpa/inet.h>
#include <errno.h>
#include "recv.h"
#include "tcp.h"
#include "types.h"
修改
以下代码给出了相同的警告:
#define __USE_XOPEN 1 /* needed for strptime */
#include <time.h>
#include <stdio.h>
int main()
{
struct tm tm;
char date_time[] = "3-May-11 12:49:00";
if (strptime(date_time, "%d-%b-%y %T", &tm) == NULL) {
fprintf(stderr, "Error: strptime failed matching input\n");
}
return 0;
}
编辑编辑
但将其更改为_XOPEN_SOURCE有效!并将定义移动到程序的顶部修复了原始文件。
答案 0 :(得分:3)
根据POSIX documentation,strptime
中声明了<time.h>
。
你需要
#define _XOPEN_SOURCE
/* other headers, if needed, after the #define
#include <assert.h>
#include <ctype.h>
#include <stdio.h>
*/
#include <time.h>
在范围内拥有正确的原型。
如果没有原型,编译器会假定函数返回int
。
答案 1 :(得分:2)
[发布完整包含块后编辑]
您使用的是错误的功能选择宏,并且您在错误的位置执行此操作
#define __USE_XOPEN 1
仅在glibc内部执行时才有效,而不是在执行时。{
#define _XOPEN_SOURCE
是您应该使用的内容,但只有在所有 #include
系统标头之前放置它才有效。
此外,您的代码显示不良样式:在if
内显式比较NULL(或0)是一个糟糕的代码气味。你应该这样写:
if (!strptime(...))
另外,合理的人可以不同意这一点,但我完全不相信使用NULL。在C中,0是一个非常好的空指针常量,除非在非常不寻常的条件下 - 并且在这些条件下 NULL不能正常工作。 (C ++中的情况有所不同。)
答案 2 :(得分:2)
我认为你收到了警告,因为strptime
未被声明。 (如果没有声明,strptime
默认返回int
。)正如您已经猜到的,这可能是由于缺少#define _XOPEN_SOURCE
。
以下程序在Ubuntu 10.04.2 LTS上使用“gcc”不会产生警告。这是你的程序的样子吗?
#define _XOPEN_SOURCE
#include <time.h>
int main() {
struct tm tm;
char date_time[] = "Monday morning";
if (strptime(date_time, "%d-%b-%y %T", &tm) == NULL) {
}
return 0;
}
修改强> 您不能定义__USE_XOPEN。您必须定义_XOPEN_SOURCE。从linux手册页中,正确的用法是:
#define _XOPEN_SOURCE
#include <time.h>
答案 3 :(得分:0)
简单。将它与0进行比较。 如果strptime(date_time,“%d-%b-%y%T”,&amp; tm)== 0