如何从 GetEnv 和 Literal 初始化 Ada 无界字符串

How to initialise an Ada Unbounded String from GetEnv & Literal

你好,我在应该是一段简单代码的地方发现了编译错误。 objective 是使用环境变量作为默认值的一部分。我们正在使用 Ada95,所以我想知道它是否是版本问题。

我们声明的“模型”看起来像这样:

  Default_Override_Message_Text   : Ada.Strings.Unbounded.Unbounded_String
      := Ada.Strings.Unbounded.To_Unbounded_String(
             Gnat.Os_Lib.Getenv( "DATA_FILES" ) & 
             "/override_required.txt" );

我在 & 上遇到错误:

然而,这很好。

  Default_Override_Message_Text   : Ada.Strings.Unbounded.Unbounded_String
      := Ada.Strings.Unbounded.To_Unbounded_String(
             "DATA_FILES" & "/override_required.txt" );

我求助于互联网和书籍,似乎它应该有效,但打字或其他方面有困难。 PLEAC 上给出的例子也给我一个错误。

    username : string := Gnat.Os_Lib.Getenv("USER");
    DATA_FILES  : String := Gnat.Os_Lib.Getenv( "DATA_FILES" );

报错:

我认为通过这种方法我可以

DATA_FILES   : String := Gnat.Os_Lib.Getenv( "GPS_DATA_FILES" );

Default_Override_Message_Text : Ada.Strings.Unbounded.Unbounded_String
        := Ada.Strings.Unbounded.To_Unbounded_String(
                DATA_FILES & "/override_required.txt" ); -- ERROR

DATA_FILES_2 : String := "GPS_DATA_FILES";        -- WORKS

Default_Override_Message_Text : Ada.Strings.Unbounded.Unbounded_String
        := Ada.Strings.Unbounded.To_Unbounded_String(
                DATA_FILES_2 & "/override_required.txt" ); -- WORKS

我仍然对 GetEnv 做错了,因为看起来我们想要的一切都会发生,类似于 DATA_FILES_2 选项会起作用(根据我的编译器),如果我可以正确地从 GetEnv 分配值().

有人可以指出我的错误吗?或者 Ada95 是否对我正在查看的示例使用了不同的规则?

Gnat.Os_Lib.Getenv函数的声明是:

function Getenv (Name : String) return String_Access;

请注意,它 return 是 String_Access,而不是字符串(我不确定为什么)。

添加 .all 以从 String_Access 结果中获取 String 值应该可以解决您的问题:

Default_Override_Message_Text   : Ada.Strings.Unbounded.Unbounded_String
   := Ada.Strings.Unbounded.To_Unbounded_String(
         Gnat.Os_Lib.Getenv( "DATA_FILES" ).all & 
         "/override_required.txt" );

Gnat.Os_Lib.Getenv return 一个 String_Access 而不是 String 可能是一个区分缺失环境变量和值为空的环境变量的机会字符串。不幸的是,return在这两种情况下都是对空字符串的访问。)