如何比较两个含#define常量的调优文件差异?
对比两个#define常量文件的数值差异
针对两个仅常量数值不同的#define文件,以下是几种实用的对比思路:
方法一:用awk+join快速生成差异报告
通过awk提取常量名和数值,再用join合并两个文件的对应条目,最后计算差异并格式化输出:
join <(awk '/^#define/ {print $2, $3}' basetune.h | sort) <(awk '/^#define/ {print $2, $3}' tuning.h | sort) | awk '{printf "%-20s 基础值: %s 调优值: %s 差异: %d\n", $1, $2, $3, $3-$2}'
- 第一步:
awk '/^#define/ {print $2, $3}'提取每行的常量名和数值 - 第二步:
sort对结果排序,确保join能匹配相同常量名的行 - 第三步:
join合并两个文件中常量名一致的行 - 第四步:
awk格式化输出,同时计算调优值与基础值的差异
方法二:标准化格式后用diff对比
先统一两个文件的行格式,让diff能精准识别数值差异:
diff <(sed 's/^#define\s\+\(\S\+\)\s\+\([0-9]\+\)/#define \1 \2/' basetune.h | sort) <(sed 's/^#define\s\+\(\S\+\)\s\+\([0-9]\+\)/#define \1 \2/' tuning.h | sort)
sed命令将所有#define行标准化为#define 常量名 数值的格式(统一空格分隔)sort让相同常量名的行对齐,diff会直接高亮数值部分的差异,适合需要直观查看行变化的场景
方法三:Python脚本实现灵活对比(适合复杂场景)
如果需要过滤无差异条目、识别多进制数值或处理注释,可以用Python脚本实现更精细的对比:
#!/usr/bin/env python3 def parse_defines(filename): defines = {} with open(filename, 'r') as f: for line in f: line = line.strip() if line.startswith('#define'): # 拆分时忽略注释部分 line_no_comment = line.split('//')[0].split('#')[1].strip() parts = line_no_comment.split() if len(parts) >=2: name = parts[1] try: # 自动识别十进制、十六进制数值 value = int(parts[2], 0) defines[name] = value except ValueError: continue # 跳过非数值类型的#define return defines base_defs = parse_defines('basetune.h') tuning_defs = parse_defines('tuning.h') # 输出共同常量的差异 common_names = sorted(set(base_defs.keys()) & set(tuning_defs.keys())) print(f"{'常量名':<20} {'基础值':<10} {'调优值':<10} {'差异'}") print('-'*55) for name in common_names: base_val = base_defs[name] tuning_val = tuning_defs[name] diff = tuning_val - base_val print(f"{name:<20} {base_val:<10} {tuning_val:<10} {diff:+d}") # 输出仅在单个文件存在的常量 only_base = sorted(set(base_defs.keys()) - set(tuning_defs.keys())) if only_base: print("\n仅在基础文件中存在的常量:") for name in only_base: print(f"- {name}: {base_defs[name]}") only_tuning = sorted(set(tuning_defs.keys()) - set(base_defs.keys())) if only_tuning: print("\n仅在调优文件中存在的常量:") for name in only_tuning: print(f"- {name}: {tuning_defs[name]}")
- 脚本会自动忽略行尾的注释,支持十进制、十六进制等数值格式
- 不仅输出差异,还能识别仅在一个文件中存在的常量,适合复杂的常量文件对比
注意事项
- 如果#define行包含宏参数(比如
#define MAX(a,b) ((a)>(b)?(a):(b))),需要调整提取逻辑,过滤掉非常量的行 - 若数值包含后缀(如
U/L),需要在处理时去掉后缀再转换数值
内容的提问来源于stack exchange,提问作者Charles
相关产品推荐
相关产品推荐

