【Linux】vscode 对 pthread_rwlock_t 等报错 解决方法

在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

“”在这里插入图片描述

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值