3

EclipseのCコードに問題がありました。具体的には、私のsleep-methodは、timespecが記述されている行にエラーを生成します。私が何を間違えたのか教えてもらえますか?コードは次のとおりです。

void sleep(double time) {
    nanosleep(
        (struct timespec[]) { {time,((time -((time_t)time)) * 1000000000)}},
        NULL);
}
4

1 に答える 1

5

タイプ を定義するヘッダーファイルをインクルードする必要がありますtimespec。また:

  • ヘッダーファイルをインクルードするのを忘れた、または
  • タイプを前方宣言しただけです。

2番目はエラーの最も可能性の高い原因のようです。配列を作成しているので、コンパイラは、配列にtimespecその量のメモリを割り当てる必要があるため、の定義を知る必要があります。


問題は、C標準で定義されていないstruct timespecことです。nanosleep()それらはPOSIX標準によって提供されます。コンパイルしているようです。-std=c99これにより、コンパイラはC99標準に厳密に準拠し、エラーが報告されます。これらのPOSIX構造をコンパイルできるようにするには、それらを明示的に有効にする必要があります。

とのコンパイルstd=c99

POSIX定義を有効にした後のコンパイル

#if __STDC_VERSION__ >= 199901L
# define _XOPEN_SOURCE 600
#else
# define _XOPEN_SOURCE 500
#endif /* __STDC_VERSION__ */

#include <time.h>

int main()
{
    double time = 0.1;

    nanosleep((struct timespec[]) { {time, ((time - ((time_t)time)) *
               1000000000)}}, NULL);

    return 0;
}  

__STDC_VERSION__使用しているコンパイラがc99であるかどうかをチェックし、コンパイラによってはPOSIX定義を有効にします。
_XOPEN_SOURCE参照するPOSIXのバージョンを定義します。使用するPOSIXバージョンに従って定義を選択します。600を参照しますがPOSIX 2004500参照しPOSIX 1995ます。

于 2013-01-19T14:44:52.587 に答える