2014-11-15 5 views
5

라즈베리 파이에 직렬 코드를 작성하고 C99로 전환했습니다. -M 2 termios.h 헤더를 보여 사용CRTSCTS는 C99로 컴파일 할 때 정의하지 않습니다.

$ c99 -M serial01.c | grep termios.h 
/usr/include/termios.h /usr/include/arm-linux-gnueabihf/bits/termios.h \ 
$ gcc -M serial01.c | grep termios.h 
/usr/include/termios.h /usr/include/arm-linux-gnueabihf/bits/termios.h \ 

: 내가 한 때 나는 오류 " 'CRTSCTS'선언되지 않은 (이 기능에서 처음 사용) 오류"를 받기 시작했다. 전자는 CRTSCTS에 대한 정의를 포함하지 않으며 후자는 정의를 포함하지 않습니다.

표준 c89는 좋은 것을 사용하고 c99는 사용하지 않는다고 가정하지만 -M 호출의 결과가 동일하므로 잘 모르겠습니다. 누구나 C99로 전환 할 때 왜 이런 일이 일어나는 지 설명 할 수 있습니까?

+1

Thanks Mat, -std = gnu99 컴파일러 플래그로 수정했습니다. – CamW

+1

'-std = gnu99'도 나에게 알렸다. 답으로 게시 할 수있다. –

답변

4

gcc/c99 -M 호출 결과는 동일하지만 아무런 의미가 없습니다! 이 동작에 대한 설명은 전 처리기 매크로 (특히 GNU 확장입니다. 상세

:

cat -n main.c 
    1 #include <termios.h> 
    2 
    3 int printf(const char *, ...); 
    4 
    5 int main(void) 
    6 { 
    7  printf("%d\n", CRTSCTS); 
    8  return 0; 
    9 } 
gcc main.c -o main --std=c89 -> 'CRTSCTS' undeclared compilation error 
gcc main.c -o main --std=cgnu89 -> successfully compiled 

이 문제는 C99과 gnu99에 대해 동일합니다!

추천 카메론 말했다 -M 출력은 동일하다 :

gcc -M --std=c89 main.c | grep termios.h | nl 
    1 main.o: main.c /usr/include/termios.h /usr/include/features.h \ 
    2 /usr/include/arm-linux-gnueabihf/bits/termios.h 
gcc -M --std=gnu89 main.c | grep termios.h | nl 
1 main.o: main.c /usr/include/termios.h /usr/include/features.h \ 
    2 /usr/include/arm-linux-gnueabihf/bits/termios.h \ 

CRTSCTS는 비트/termios.h에 정의 __USE_MISC가 이제 __USE_MISC 보자

 1 #ifdef __USE_MISC 
    2 # define CIBAUD 002003600000   /* input baud rate (not used) */ 
    3 # define CMSPAR 010000000000   /* mark or space (stick) parity */ 
    4 # define CRTSCTS 020000000000   /* flow control */ 

정의 될 때.

gcc -M /usr/include/termios.h | nl 
    1 termios.o: /usr/include/termios.h /usr/include/features.h \ 
    2 /usr/include/arm-linux-gnueabihf/bits/predefs.h \ 
    3 /usr/include/arm-linux-gnueabihf/sys/cdefs.h \ 
    4 /usr/include/arm-linux-gnueabihf/bits/wordsize.h \ 
    5 /usr/include/arm-linux-gnueabihf/gnu/stubs.h \ 
    6 /usr/include/arm-linux-gnueabihf/bits/types.h \ 
    7 /usr/include/arm-linux-gnueabihf/bits/typesizes.h \ 
    8 /usr/include/arm-linux-gnueabihf/bits/termios.h \ 
    9 /usr/include/arm-linux-gnueabihf/sys/ttydefaults.h 

첫 번째, features.h, __USE_MISC의 정의를 포함하지만, _GNU_SOURCE 또는 '아무것도'가 정의 될 때 _BSD_SOURCE 또는 _SVID_SOURCE는

grep 'define __USE_MISC' /usr/include/features.h -B 1 | nl 
    1 #if defined _BSD_SOURCE || defined _SVID_SOURCE 
    2 # define __USE_MISC  1 

및 _BSD_SOURCE 및 _SVID_SOURCE가 정의를 정의하는 경우에만

 1 #ifdef _GNU_SOURCE 
    2 # undef _ISOC95_SOURCE 
    3 # define _ISOC95_SOURCE 1 
    4 # undef _ISOC99_SOURCE 
    5 # define _ISOC99_SOURCE 1 
    6 # undef _POSIX_SOURCE 
    7 # define _POSIX_SOURCE 1 
    8 # undef _POSIX_C_SOURCE 
    9 # define _POSIX_C_SOURCE  200809L 
    10 # undef _XOPEN_SOURCE 
    11 # define _XOPEN_SOURCE 700 
    12 # undef _XOPEN_SOURCE_EXTENDED 
    13 # define _XOPEN_SOURCE_EXTENDED 1 
    14 # undef _LARGEFILE64_SOURCE 
    15 # define _LARGEFILE64_SOURCE 1 
    16 # undef _BSD_SOURCE 
    17 # define _BSD_SOURCE 1 
    18 # undef _SVID_SOURCE 
    19 # define _SVID_SOURCE 1 
    20 # undef _ATFILE_SOURCE 
    21 # define _ATFILE_SOURCE 1 
    22 #endif 

    23 /* If nothing (other than _GNU_SOURCE) is defined, 
    24  define _BSD_SOURCE and _SVID_SOURCE. */ 
    25 #if (!defined __STRICT_ANSI__ && !defined _ISOC99_SOURCE && \ 
    26  !defined _POSIX_SOURCE && !defined _POSIX_C_SOURCE && \ 
    27  !defined _XOPEN_SOURCE && !defined _BSD_SOURCE && !defined _SVID_SOURCE) 
    28 # define _BSD_SOURCE 1 
    29 # define _SVID_SOURCE 1 
    30 #endif 
2

xtreye가 요청한대로 및 공식 답변에서 설명하지만 해결책을 명시 적으로 명시하지 않았기 때문에을 사용하여이 문제를 해결했습니다.컴파일러 플래그.

희망이 있습니다.