&GLOBAL-DEFINE 和 &SCOPED-DEFINE in Progress 4gl 有什么区别?

What is the difference between &GLOBAL-DEFINE and &SCOPED-DEFINE in Progress 4gl?

我知道两者都是预处理器指令,但我无法弄清楚它们有何不同。官方 Progress 文档中的所有内容都是 "The syntax of the &GLOBAL-DEFINE and &SCOPED-DEFINE directives are identical but these directives are used differently.",这不是很有帮助。

我发现一个来源说 &SCOPED-DEFINE 变量保持定义直到编译器完成当前文件,而 &GLOBAL-DEFINE 变量保持定义直到编译器完成当前程序。但是,我不太明白那是什么意思。 This source also states that &SCOPED-DEFINE variables propagated down the include stack,但不是向上传播(我假设&GLOBAL-DEFINE是双向的?)。我试图创建一个简单的示例,但无论如何,我无法找出区别。

文件 1:test1.p

{test2.i}

文件 2:test2.i

&GLOBAL-DEFINE HELLO "Hello world!"
{test3.i}

文件 3:test3.i

MESSAGE {&HELLO} VIEW-AS ALERT-BOX.

无论HELLO 是&SCOPED-DEFINE 还是&GLOBAL-DEFINE,它仍然在test3.i 中定义。那么到底有什么区别呢?

你说你假设全局向上传播,这是我在寻找答案时发现的here。但是,您的示例仅测试向下传播。也许你需要这个...

文件 1:test1.p

{test2.i}
MESSAGE {&HELLO} VIEW-AS ALERT-BOX.
MESSAGE "{&GOODBYE}" VIEW-AS ALERT-BOX.

文件 2:test2.i

&GLOBAL-DEFINE HELLO "Hello world!"
&SCOPED-DEFINE GOODBYE Goodbye-cruel-world
{test3.i}

文件 3:test3.i

MESSAGE {&HELLO} VIEW-AS ALERT-BOX.
MESSAGE "{&GOODBYE}" VIEW-AS ALERT-BOX.

我希望 test1.p 向您显示 Hello world! 后跟一条空消息,而 test3.p 会向您显示完整的两条消息。不过我没试过所以我可能是错的。