-std=gnu99
就是解决方案。更详细的内容如下。
使用gcc/c99 -M调用的结果相同,但这并不意味着什么!这种行为的解释是预处理器宏(特别是GNU扩展,如Mat所说)。
详细情况如下:
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 在定义 __USE_MISC 的情况下在 bits/termios.h 中被定义。
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 */
让我们来看一下 __USE_MISC。
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 的定义,但仅当 _BSD_SOURCE 或 _SVID_SOURCE 被定义时才会生效。
grep 'define __USE_MISC' /usr/include/features.h -B 1 | nl
1
2
当定义了_GNU_SOURCE或“nothing”时,_BSD_SOURCE和_SVID_SOURCE也被定义。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 /* If nothing (other than _GNU_SOURCE) is defined,
24 define _BSD_SOURCE and _SVID_SOURCE. */
25
26 !defined _POSIX_SOURCE && !defined _POSIX_C_SOURCE && \
27 !defined _XOPEN_SOURCE && !defined _BSD_SOURCE && !defined _SVID_SOURCE)
28
29
30