簡體   English   中英

在 Inno Setup Pascal Script 中在運行時評估預處理器宏

[英]Evaluate preprocessor macro on run time in Inno Setup Pascal Script

我正在使用 Inno Setup #define 指令來定義有關安裝程序中軟件包的所有信息,然后使用其他指令來提取該字符串的部分內容。 因此,例如,使用以下內容, PartNumber(Package1)將返回 05414。

#define Package1 "05414 - My Package"
#define PartNumber(str Package) Copy(Package, 1, 5)

我在腳本和代碼中使用這種方法,效果很好。 但是,我遇到了一種情況,以編程方式生成字符串會很方便,但我無法讓它正常工作。 例如,我想做類似以下的事情。

procedure Foo(Package: String);
var
  PartNumber: String;
begin
  PartNumber:= ExpandConstant(Format('{#PartNumber(%s)}', [Package]));
end;

procedure Bar();
begin
   Foo(ExpandConstant('{#Package1)}')); 
end;

FooPackage參數是正確的,但我收到一個編譯器錯誤說

[ISPP] 格式“%”沒有參數”。

似乎它不喜歡PartNumber行上字符串中的# 即使在普通字符串中包含#也會給出“未終止的預處理器指令”錯誤,所以我認為它將#解釋為精度說明符或其他東西。

有沒有辦法讓它把#作為文本的一部分,以便我可以以編程方式擴展這個常量? 如果沒有,是否還有其他方法可以實現這一目標?

這是行不通的。

PartNumber是一個預處理器函數/宏 它在編譯時進行評估。 它在運行時不存在。


當然,您可以實現等效的 Pascal Script 函數:

function PartNumberPascal(Package: string): string;
begin
  Result := Copy(Package, 1, 5);
end;

procedure Foo(Package: String);
var
  PartNumber: String;
begin
  PartNumber := PartNumberPascal(Package);
end;

可能讓您感到困惑的是這個電話:

Foo(ExpandConstant('{#Package1}')); 

它可能給您的印象是ExpandConstant函數擴展了Package1預處理器定義。

它不是!

{#...}語法(與{...}相反)不是常量 這是一個內聯預處理器指令調用,其中,當沒有明確指定指令時,隱含了emit 所以{#Package1}{#emit Package1}相同。 並且作為每個預處理器構造,它都會在編譯時進行評估。

如果SaveToFile預處理器函數調用添加到腳本末尾:

procedure Bar();
begin
  Foo(ExpandConstant('{#Package1}')); 
end;

#expr SaveToFile(AddBackslash(SourcePath) + "Preprocessed.iss")

編譯后,檢查Preprocessed.iss是什么樣的。 你會看見:

procedure Bar();
begin
  Foo(ExpandConstant('05414 - My Package')); 
end;

Package1擴展到它的值。 但是ExpandConstant仍然存在,因此它完全沒用! '05414 - My Package'中沒有常量)

這將產生相同的效果:

procedure Bar();
begin
  Foo('{#Package1}'); 
end;

對於類似的問題,請參閱:
在 Inno Setup Pascal Script 中在運行時評估來自預處理器的數據集合

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM