-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=c11
GCC(또는 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.h
src/libsoq 하위 디렉터리에 있습니다.
C11은 다음을 정의합니다.struct timespec
C11은 다음을 정의합니다.struct timespec
POSIX와 호환되는 방식으로 이를 수행합니다(먼저 정의함).
헤더는 유형을 정의합니다.이를 사용하는 기능 중 세 가지는 에서 선언되고 다른 하나는 에서 선언되어 있습니다.<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
'programing' 카테고리의 다른 글
오류: c에서 입력 끝에 선언 또는 문이 필요합니다. (0) | 2023.06.13 |
---|---|
.NET EXE를 읽을 수 있는 C# 소스 코드로 압축 해제하려면 어떻게 해야 합니까? (0) | 2023.06.13 |
0으로 나누기 0을 반환하는 방법 (0) | 2023.06.13 |
Oracle - 두 DateTime 열 간의 차이를 분 단위로 파악하는 데 가장 적합한 SELECT 문은 무엇입니까? (0) | 2023.06.13 |
jinja2에서 파이썬 함수 호출 (0) | 2023.06.13 |