在Linux环境下使用 VScode 编写C代码,在进行关于进程、现程开发的时候,一些系统调用或者定义(比如像 mq_timedsend()
、pthread_rwlock_t
等) 编辑器都无法解析出来,经常会出现无法跳转函数定义、飘红等,除了没有 include 相关的头文件之外,很可能是没有进行宏定义导致的 VScode 解析器无法识别。
1. 原因分析
pthread_rwlock_t
定义在文件 pthreadtypes.h
中:
#if defined __USE_UNIX98 || defined __USE_XOPEN2K
/* Data structure for reader-writer lock variable handling. The
structure of the attribute type is deliberately not exposed. */
typedef union
{
struct __pthread_rwlock_arch_t __data;
char __size[__SIZEOF_PTHREAD_RWLOCK_T];
long int __align;
} pthread_rwlock_t;
可以看到,需要事先进行 __USE_UNIX98
或 __USE_XOPEN2K
的宏定义才行,这就是 vscode 无法解析出来的原因。
而关于 __USE_XOPEN2K
的定义则是在头文件 features.h
中:
#if defined _POSIX_C_SOURCE && (_POSIX_C_SOURCE - 0) >= 200112L
# define __USE_XOPEN2K 1
# undef __USE_ISOC95
# define __USE_ISOC95 1
# undef __USE_ISOC99
# define __USE_ISOC99 1
#endif
这说明了,要先有 _POSIX_C_SOURCE
的宏定义,且_POSIX_C_SOURCE >= 200112L
才行。
1.1 关于POSIX
POSIX(Portable Operating System Interface)是一系列由 IEEE(电气和电子工程师协会)制定的标准,旨在规定操作系统应该提供的接口和服务,以确保跨平台的可移植性。
_POSIX_C_SOURCE
宏的值决定了编译器在编译时应该遵循的 POSIX 版本。不同的值对应不同的 POSIX 版本,从而影响哪些 POSIX 功能和 API 被暴露给编译的程序。常见的 _POSIX_C_SOURCE
值包括:
- 199001L:对应 POSIX.1-1990 标准。
- 199309L:对应 POSIX.1-199309 标准。
- 199506L:对应 POSIX.1-1995 标准,也称为 POSIX.1c。
- 200112L:对应 POSIX.1-2001 标准,也称为 POSIX.1-2001 或 IEEE Std 1003.1-2001。
- 200809L:对应 POSIX.1-2008 标准,也称为POSIX.1-2008 或 IEEE Std 1003.1-2008。
(以上内容来自通义千问)
2. 解决方法
综上所述,我们只要在 VScode 的C代码解释器赋予一个 _POSIX_C_SOURCE = 200809L
的宏定义即可:
在 .vscode
文件夹下,打开 c_cpp_properties.json
文件,在 "defines"
字段中加入 _POSIX_C_SOURCE=200809L
“”