Inno Setup Pascal脚本读取预处理器#define数组时出现未声明标识符I的问题
问题原因
编译报错“未声明标识符:I”的核心原因是预处理器的执行时机早于Pascal代码的编译阶段:
- 你用
{#MYARRAY[I]}试图让预处理器解析数组下标,但预处理器处理代码时,Pascal的循环变量I还未被编译器识别,预处理器会把I当作一个未定义的宏名,因此抛出错误。 - 另外原代码的循环条件
to {#MYARRAY_SIZE}会导致I取值到2,超出数组的有效下标范围(0和1),即使解决了I的问题,后续也会出现数组越界错误。
解决方案
优先使用Pascal原生数组替代预处理器宏定义,这是最符合语言规范且灵活的方式:
const MYARRAY: array[0..1] of string = ('foo', 'bar'); MYARRAY_SIZE = 2; procedure do_something(); var I: Integer; begin // 循环范围改为MYARRAY_SIZE - 1,避免越界 for I := 0 to MYARRAY_SIZE - 1 do begin SuppressibleMsgBox(MYARRAY[I], mbInformation, MB_OK, IDOK); end; end;
如果因特殊需求必须使用预处理器,只能手动展开循环(预处理器不支持动态变量下标):
#dim MYARRAY[2] #define MYARRAY[0] 'foo' #define MYARRAY[1] 'bar' #define MYARRAY_SIZE 2 procedure do_something(); begin SuppressibleMsgBox('{#MYARRAY[0]}', mbInformation, MB_OK, IDOK); SuppressibleMsgBox('{#MYARRAY[1]}', mbInformation, MB_OK, IDOK); end;
内容的提问来源于stack exchange,提问作者Uvuvwevwevwevwe
相关产品推荐
相关产品推荐

