编程开发与计算机科学

跨平台 C 语言开发
  1. 通过 WIN32 宏来判断是否为 Windows 平台。64位 Windows 也会定义 WIN32 宏,此外还定义 WIN64 宏,有些编译器可能是 Windows__WIN32__WIN32_WIN64
  2. 通过 _MSC_VER 宏判断是否是VC编译器
  3. 通过 __GNUC__ 宏来判断是否为 gcc 编译器
  4. Windows 平台上的 gcc 编译器支持__declspec(dllimport)__declspec(dllexport)
  5. Linux 平台上 gcc 通过 __attribute__ ((visibility("default"))) 来导出函数
  6. VC不支持 inline 关键字,要用 __inline。可以用如下代码定义:
    C#if defined(_MSC_VER) && !defined(__cplusplus) && !defined(inline)
        #define inline __inline
    #endif
  7. 数组索引用 size_t 类型、指针运算用 uintptr_t, intptr_t, ptrdiff_t、平台无关整型用 int32_t, int64_t
  8. 64位平台上的 sizeof(long double) 是16字节(VC不支持),但是实际使用长度是12字节,4字节填充的是随机数据(绝对大坑)
  9. 如果 C 代码可能被 C++ 项目使用,最好根据 __cplusplus 宏做下判断
  10. MacOSX的平台宏是 __APPLE____MACH__(这个没确认)
  11. 补充几个编译器识别的宏:__BORLANDC____llvm____clang____WATCOMC__

……

Lua 源代码中的字节对齐

Lua 源码中定义了一个叫 L_Umaxalign 的数据类型:

ctypedef union { 
  double u; 
  void *s; 
  lua_Integer i; 
  long l; 
} L_Umaxalign;

这个结构其实是该平台上最长的数据类型。

……

PHP 中的服务定位和依赖注入

尝试了很多PHP框架,有轻量级的,也有企业级的,发现解耦都做得很不好,自由度都很差。Zend framework2.0 做得还不错,就是封装太多,不够轻量。

一、创建对象

从最原始的new操作符,到abstract factory或builder等经典创建模式,都不能满足人民群众日益高涨的解耦需求。后来,MF创造了控制反转(IoC)/依赖注入(DI)理论,提供了一个完美的解耦方案。听说一个叫"春"的JAVA框架实现了完美的IoC容器,不过我也没接触过,不太了解。

……

MSN 双开工具源代码

网上偶然拾得本人于 2006 年所写的 MSN Messenger 双/多开工具的源代码。此即时通讯软件早于 2013 年便已停止服务,而今再看昔日所写代码不甚感慨,遂记录于此,以兹纪念