Delphi 中不同单元中,同一名称类型的处理是以最后的一个为准。如果是在 C++ 中,如果通过 using namespace 语句同时使用的两个命名空间中有两个同名的类型,比如我们在 C++ Builder 中使用 Graphics 32 库,其 Gr32 命名空间中定义了 TPoint、TRect 等 System::Types 命名空间等类型,如果咱们在设计时,如果包含了这两个类型的参数,那就会造成编译器不知道该链接那个类型的问题。
如果是普通自己写的函数还好,大不了前面加上命名空间的限定。但如果是控件的事件中带有相关的参数,那就惨了。你一旦修改加上命名空间前缀,那 IDE 就会频繁报错,告诉你声明不对,最终我们不得不寻找它途。
在一顿上窜下跳,想看看别人怎么解决而不得之后,被迫走向歪门邪道,我们可以用宏来解决这个问题:
#define TPoint System::Types::TPoint
#define TRect System::Types::TRect
....
#undef TPoint
#undef TRect
由于宏是预编译指令,所以它比 using 一类的指令更早的被处理,最终完美解决这个问题。