Windows API和GetClassName()?另一个名字?

Rob*_*uld 3 c++ windows api-design

我有一些代码在C++中有一个动态类系统,它有一个名为GetClassName()的成员,一个人们可以想象的无害的名字.然而,当包含在一个带有Windows标题的大型项目中时,所有地狱都会崩溃.显然,Windows使用#define GetClassName(GetClassNameA或GetClassNameW)搞砸了所有东西,我的虚拟调用树变得一团糟,让我在黑暗中愚蠢的编译器调试中失去了一天,试图弄清楚出了什么问题.

所以除了我诅咒微软使用这样一个非常容易冲突的#define名称这一点之外(我的意思是有人应该诚实地为此拍摄!)我要求3个目的.

  1. GetClassName()的另一个好名字是什么?
  2. 无论如何要解决这个问题,所以将来,我的代码库的其他开发人员也不会遇到类似的命运
  3. 对于后人来说,当别人遇到这种类似的莫名其妙的错误时

Sho*_*og9 5

  1. ClassGetName()
  2. #undef GetClassName
  3. WinAPI是一个C API.没有名称空间.其他一些平台试图通过为所有符号名称添加前缀来缓解这种情况,但最终也会崩溃.最好的选择:如果你正在写,不依赖于Windows平台的SDK头的代码,那就不要#include他们.


eug*_*nsk 4

我会重命名该方法。

当然可以说

#include <windows.h>
#undef GetClassName
Run Code Online (Sandbox Code Playgroud)

但它并不干净,代码的用户在调用 win32 函数时应该记住编写::GetClassNameW。

可以在他的类中提供 GetClassNameA 和 GetClassNameW 方法,但这非常丑陋。

我看到两种方法:延长或缩短名称:)

1) 为子系统中的所有函数添加前缀 fe TI_(用于类型信息):

TI_GetClassName() 
TI_GetBaseClass() 
TI_IsDerivedFromClass()
etc  
Run Code Online (Sandbox Code Playgroud)

2)或者将它们放入一些IClass接口中

interface IClass {
GetName();
GetBase(); 
IsDerivedFrom();
etc
Run Code Online (Sandbox Code Playgroud)

并从单个方法返回该接口,
以便 GetClassName() 变为

GetClass()->GetName()
Run Code Online (Sandbox Code Playgroud)