Linux 64位系统下适配32位代码中long类型的问题求助
解决32位MUD程序迁移64位系统的数据存储兼容性问题
核心思路:用typedef固定数据类型大小
通过typedef定义与原32位系统中long/unsigned long等价的固定宽度类型,替代代码中所有相关变量类型,既避免全局替换的错误,又保证存储数据的字节长度和原程序完全一致。
步骤1:定义固定宽度的自定义类型
在程序的全局公共头文件中添加以下代码:
#include <stdint.h> // 对应原32位系统中的long(32位有符号整数) typedef int32_t mud_long; // 对应原32位系统中的unsigned long(32位无符号整数) typedef uint32_t mud_ulong;
步骤2:全局替换代码中的类型
将代码中所有:
long替换为mud_longunsigned long替换为mud_ulong
注意:替换时要排除字符串常量、注释中的内容,可使用编辑器的"单词匹配替换"功能避免误改。
步骤3:修正存储前的检查逻辑
把原代码中的类型检查逻辑:
if ((sizeof(char) != 1) || (int_size != long_size)) { logit(LOG_DEBUG, "sizeof(char) must be 1 and int_size must == long_size for player saves!\n"); return 0; }
修改为直接验证自定义类型的宽度(确保是32位):
if ((sizeof(char) != 1) || (sizeof(mud_long) != 4)) { logit(LOG_DEBUG, "sizeof(char) must be 1 and mud_long must be 32-bit for player saves!\n"); return 0; }
这样就不再依赖int和long的大小相等,完全适配64位系统的类型规则。
步骤4:修正格式符匹配问题
如果代码中使用printf/scanf等函数处理这些类型,需要替换对应的格式符(避免类型不匹配导致的输出/读取错误):
- 引入头文件
#include <inttypes.h> - 替换格式符:
- 原
%ld替换为%" PRId32 "(对应mud_long) - 原
%lu替换为%" PRIu32 "(对应mud_ulong)
- 原
示例:
// 原代码 printf("Player experience: %ld\n", player->exp); // 修改后 printf("Player experience: %" PRId32 "\n", player->exp);
方案优势
- 自定义类型强制固定为32位,和原32位程序中
long的字节长度完全一致,保证存储到文件的字节流格式不变,无需重写存/取逻辑。 - 避免了直接替换
long为int32_t时,unsigned long变成非法unsigned int32_t的问题。 - 不需要
-m32编译选项,解决了依赖64位库的链接冲突问题。
内容的提问来源于stack exchange,提问作者OBR_EXO
相关产品推荐
相关产品推荐

