1

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>前の行にwithを含めて#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 に変更するとうまくいきました! そして、定義をプログラムの先頭に移動すると、元が修正されました。

4

4 に答える 4

3

POSIX ドキュメントによると、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

于 2011-05-03T20:26:21.793 に答える
2

[完全な include-block の投稿後に編集]

間違った機能選択マクロを使用しており、間違った場所で実行しています。
#define __USE_XOPEN 1glibc が内部で行う場合にのみ機能し、ユーザーが行う場合には機能しません。を使用することになっていますが、すべてのシステム ヘッダーの
#define _XOPEN_SOURCE前に配置した場合にのみ機能します。 #include

また、あなたのコードは貧弱なスタイルを示しています: 内の NULL (または 0) との明示的な比較ifはコードの悪臭です。次のように記述します。

if (!strptime(...))

また、合理的な人々はこれに反対する可能性がありますが、私は NULL を使用することをまったく信じていません。C では、非常に特殊な状況を除いて、0 は完全に適切なヌル ポインター定数です。そのような状況では、NULL も機能しません。(C++ では事情が異なります。)

于 2011-05-03T20:33:22.437 に答える
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>
于 2011-05-03T20:35:43.840 に答える
0

単純。0 と比較します。 if strptime(date_time, "%d-%b-%y %T", &tm) == 0

于 2013-05-31T14:44:20.627 に答える