glfw 与 windows 的宏定义冲突 APIENTRY
Dionysen

C:\Program Files (x86)\Windows Kits\10\include\10.0.26100.0\shared\minwindef.h(130): warning C4005: “APIENTRY”: 宏重定义

APIENTRY

使用GLFW库时总是遇到这个问题,编译时警告宏重定义,遇到多次了,比较容易处理。

本质上是因为GLFW的glfw3.hminwindef.h(被Windows.h包含)中都定义了APIENTRY宏:

GLFW:

image

Windows:
image

不同点在于,GLFW中进行了保护,如果之前已有定义,就不再处理,而windows头文件中没有处理,因此,解决这个问题,要么将Windows.h放到glfw3.h之前,要么在包含Windows.h之前取消APIENTRY的定义。

但当我把项目中所有的glfw3.hWindows.h都找出来且调整了顺序之后,警告依然存在。

最后才发现,原来忘记了,我在预编译头文件中包含了Windows.h,而在其他文件中包含预编译头时没有注意顺序,或者即使注意了顺序,也被clang-format格式化了。

格式化

clang-format可以把代码变得整齐有序,且拥有很强大的风格定制能力。

我只需要保证在包含头文件时,预编译头在最前面即可:(不,还是主头文件放在最前吧)

# 允许排序#include
SortIncludes: true

# Include 分组方式: Preserve, Merge, Regroup
IncludeBlocks: Regroup

# Include 分类规则 (数字越小优先级越高)
IncludeCategories:
# 0. 预编译头文件 - 最高优先级
- Regex: '^"PreCompiled\.h"$'
Priority: 1
SortPriority: 1
# 1. Windows 系统头文件
- Regex: '^<[Ww]indows\.h>$'
Priority: 2
SortPriority: 2
# 2. GLEW 头文件
- Regex: '^<GL/glew\.h>$'
Priority: 3
SortPriority: 3
# 3. GLFW 头文件
- Regex: '^<GLFW/.*\.h>$'
Priority: 4
SortPriority: 4
# 4. 其他系统/标准库头文件
- Regex: '^<.*\.h>$'
Priority: 5
SortPriority: 5
- Regex: '^<.*>$'
Priority: 6
SortPriority: 6
# 6. 其他项目头文件
- Regex: '^".*"$'
Priority: 7
SortPriority: 7

# 主头文件识别正则表达式
IncludeIsMainRegex: '(Test)?$'

这样重新格式化所有代码,问题自然而然解决了。

显示评论