programing

-std=c99를 사용하는 GCC가 구조 시간 사양을 모른다고 불만을 제기합니다.

lovejava 2023. 6. 13. 21:52

-std=c99를 사용하는 GCC가 구조 시간 사양을 모른다고 불만을 제기합니다.

리눅스에서 이 파일을 컴파일할 때gcc -std=c99컴파일러가 모르는 것에 대해 불평합니다.struct timespec하지만 만약 내가 이것을 없이 컴파일한다면.-std=c99모든 것이 잘 작동합니다.

#include <time.h>

int main(void)
{
  struct timespec asdf;
  return 0;
}

이것이 왜 그리고 그것이 여전히 작동하도록 하는 방법이 있습니까?-std=c99?

POSIX 기능을 명시적으로 활성화

시간 사양은 POSIX에서 제공되므로 POSIX 정의를 '활성화'해야 합니다.

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

#include <time.h>

void blah(struct timespec asdf)
{
}

int main()
{
    struct timespec asdf;
    return 0;
}

맨 위에 있는 스탠자는 현재 제가 사용하는 스탠자입니다. C99 컴파일러를 사용하는지 C89 컴파일러를 사용하는지에 따라 SUS(Single UNIX Specification)에서 정의를 트리거합니다.

  • POSIX 2008(SUS v4) 자료를 원하시면,_XOPEN_SOURCE 700
  • POSIX 2004 (SUS v3) 자료를 원하시면,_XOPEN_SOURCE 600
  • POSIX 1995 (SUS v2, 1997) 자료를 원하시면,_XOPEN_SOURCE 500

주석에 명시된 대로, 사용_XOPEN_SOURCE는 엄격한 POSIX를 통해 XSI(X/Open System Interface) 확장을 엄격하게 활성화하지만 XSI가 아닌 POSIX를 원하는 경우는 매우 드물다.일반적으로 다음을 지정해야 합니다._XOPEN_SOURCE그리고 빈둥거리지 마._POSIX_C_SOURCE기능 매크로에 대한 자세한 내용은 컴파일 환경의 (POSIX 2018)을 참조하십시오.

2010년의 시스템에서 POSIX 2008은 POSIX 2004만큼 널리 사용되지 않았기 때문에 YMMV를 사용했습니다.SUS v3 및 v4는 모두 C99 컴파일이 필요합니다.Solaris에서는 적어도 C89를 사용하지 못했습니다.

GCC에서 제공-std=gnuXX옵션들

지정하는 경우-std=c11GCC(또는 Crangemulating GCC)로 이동하면 표준 C 정의만 활성화됩니다.사용하는 경우-std=gnu11그러면 POSIX 및 표준 C에 대한 기타 확장이 기본적으로 표시됩니다.

GCC 4.x 이전 버전에서는-std=gnu90기본적으로 (C90 + 확장자에 해당). GCC 5.x 이상 사용-std=gnu11결석으로사용할 수 있는 GCC 버전이 없습니다.-std=gnu99결석으로

헤더를 사용하여 POSIX 버전 정보 제어

현재(2019년) 헤더를 사용하여 이 정보를 캡슐화함으로써 향후 POSIX 기능을 사용하는 모든 소스 파일이 아닌 단일 헤더만 변경하면 됩니다.시간이 지나고 POSIX 2008이 널리 보급되면서 여러 소스 파일에서 이전 스탠자를 편집하는 것은 고통스러웠습니다.

/*
@(#)File:           $RCSfile: posixver.h,v $
@(#)Version:        $Revision: 1.4 $
@(#)Last changed:   $Date: 2017/06/18 00:15:42 $
@(#)Purpose:        Request appropriate POSIX and X/Open Support
@(#)Author:         J Leffler
@(#)Copyright:      (C) JLSS 2010-2017
*/

/*TABSTOP=4*/

#ifndef JLSS_ID_POSIXVER_H
#define JLSS_ID_POSIXVER_H

/*
** Include this file before including system headers.  By default, with
** C99 support from the compiler, it requests POSIX 2008 support.  With
** C89 support only, it requests POSIX 1997 support.  Override the
** default behaviour by setting either _XOPEN_SOURCE or _POSIX_C_SOURCE.
*/

/* _XOPEN_SOURCE 700 is loosely equivalent to _POSIX_C_SOURCE 200809L */
/* _XOPEN_SOURCE 600 is loosely equivalent to _POSIX_C_SOURCE 200112L */
/* _XOPEN_SOURCE 500 is loosely equivalent to _POSIX_C_SOURCE 199506L */

#if !defined(_XOPEN_SOURCE) && !defined(_POSIX_C_SOURCE)
#if defined(__cplusplus)
#define _XOPEN_SOURCE 700   /* SUS v4, POSIX 1003.1 2008/13 (POSIX 2008/13) */
#elif __STDC_VERSION__ >= 199901L
#define _XOPEN_SOURCE 700   /* SUS v4, POSIX 1003.1 2008/13 (POSIX 2008/13) */
#else
#define _XOPEN_SOURCE 500   /* SUS v2, POSIX 1003.1 1997 */
#endif /* __STDC_VERSION__ */
#endif /* !_XOPEN_SOURCE && !_POSIX_C_SOURCE */

#endif /* JLSS_ID_POSIXVER_H */

Stack Overflow에서 사용하는 "CC by-sa 3.0" 라이센스에 의해 일반적으로 요구되는 속성 및 저작권 고지 없이 이 헤더의 정보를 사용할 수 있습니다.이 코드는 GitHubas 파일의 SOQ(Stack Overflow Questions) 저장소에서 사용할 수 있습니다.posixver.hsrc/libsoq 하위 디렉터리에 있습니다.

C11은 다음을 정의합니다.struct timespec

C11은 다음을 정의합니다.struct timespecPOSIX와 호환되는 방식으로 이를 수행합니다(먼저 정의함).

헤더는 유형을 정의합니다.이를 사용하는 기능 중 세 가지는 에서 선언되고 다른 하나는 에서 선언되어 있습니다.<time.h>:

물론 이것들도 C17(C18)의 일부입니다.당신은 그것으로 편집해야 할 것입니다.-std=c11이와 2.(GCC 9.2.0것보으입로다는식니다인하유는g보것▁both입▁or니▁recognize다▁to으로g는▁(하▁similar식cc인(또다유▁seems는cc사은).-std=c17그리고.-std=c18,그리고.-std=c2x) 에 struct timespec자동으로 정의됩니다.

는 로컴일는것추다니천합으로 컴파일하는 것을 합니다.-std=gnu99.

이것에 대해 자세히 설명하자면.기본적으로 gcc는 -std=160089로 컴파일됩니다.다음의 소스 코드에 대한 결과입니다.

#include <time.h>

int main() {
    struct timespec asdf;
    return 0;
}

[1:25pm][wlynch@cardiff /tmp] gcc -std=gnu89 foo.c
[1:26pm][wlynch@cardiff /tmp] gcc -std=gnu99 foo.c

[1:25pm][wlynch@cardiff /tmp] gcc -std=c89 foo.c
foo.c: In function ‘main’:
foo.c:4: error: storage size of ‘asdf’ isn’t known

[1:26pm][wlynch@cardiff /tmp] gcc -std=c99 foo.c
foo.c: In function ‘main’:
foo.c:4: error: storage size of ‘asdf’ isn’t known

CFLAGS에 -D_GNU_SOURCE를 추가하는 것도 작동합니다.

gcc test.c -o test -std=c99 -D_GNU_SOURCE

/usr/include/time.h를 확인합니다.이것은 시간 사양 정의를 래핑하는 전처리기 조건입니다._GNU_SOURCE는 __USE_POSIX199309를 활성화합니다.

#if (!defined __timespec_defined                    \
 && ((defined _TIME_H                       \
  && (defined __USE_POSIX199309                 \
      || defined __USE_ISOC11))                 \
 || defined __need_timespec))
 # define __timespec_defined 1                                                                                                                                                                                                                 
 struct timespec
 {
    __time_t tv_sec;        /* Seconds.  */
    __syscall_slong_t tv_nsec;  /* Nanoseconds.  */
 }; 

언급URL : https://stackoverflow.com/questions/3875197/gcc-with-std-c99-complains-about-not-knowing-struct-timespec