问题
不同编码规范对函数名的命名格式有不同要求,但主流有以下几类:
-
PascalCase:比如 Google C++ Style Guide
-
camelCase:比如 LLVM Coding Standards
-
snake_case:比如 PPP Styple Guide、K&R Style
哪种适合 Windows 开发呢?
分析
1. PascalCase 的坑
PascalCase 偶尔会遇到和 Win32 API 宏冲突的情况:
1 |
|
以上代码无法编译,因为 SDK 头文件里有这样的定义:
1 |
导致以下编译错误:
1 | 1>function_name.cpp(7,5): warning C4003: not enough arguments for function-like macro invocation 'CreateWindowW' |
改成下面这样,才能编译:
1 |
|
以上代码虽然编译通过,但实际上 CreateWindowEx 还是个宏。用 IDA 逆向编译后的 exe,并加载 pdb 后,可以看到:
1 | ; int __cdecl main(int argc, const char **argv, const char **envp) |
虽然没啥危害,但 C++ 20 程序员不喜欢宏!
2. camelCase 是不是更好?
如果函数名使用 camelCase,则没有机会与 Win32 API 的宏定义冲突。
另一个好处是在做 API Hooking 时,命名可以更短。比如 Hook ShowWindow,那么替代函数可以就叫 showWindow,而用 PascalCase,则可能需要叫 MyShowWindow。
那么是不是把 Google C++ Style 的函数名由 PascalCase 改为 camelCase 就完美了?
更好,并不是完美……camelCase 也有个小问题——只有一个单词时,无法区分是 camelCase,还是 snake_case。比如 size,是函数(camelCase),还是临时变量(snake_case)?
总结
UMU 建议,如果已经在使用 Google C++ Style,应该避免函数名与 Win32 API 一样。如果正在从头制定一套 Coding Style,则可以考虑函数用 camelCase。