You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 19:01:10