理解{$ WARN XXXX OFF}编译器指令

时间:2015-01-07 00:41:13

标签: freepascal

如果我试图不加思索地使编译器消息无声,编译器命令行参数-vmXXXX可以完美地用于整个项目。但是,如果我试图在源代码中有选择地静默消息​​,我必须使用{$ WARN XXXX OFF}编译器指令。

问题是......我很难理解应用编译器指令的规则。在下面的1个程序和2个单元的示例中,如果您一次取消一个{$ WARN XXXX OFF}命令,将会发生什么不是我所期望的(结果写在每个编译器指令的注释中)。

是否有人能够准确解释编译器指令的工作原理?

程序:

program Project1;
//{$WARN 4055 OFF} // will silence the unit2 hint but not the unit1 hint
uses
 Unit1;
//{$WARN 4055 OFF} // will silence neither the unit2 hint nor the unit1 hint
begin
 if convert_it(0)=nil then
  halt(1);
end.

第一单元:

unit Unit1;
//{$WARN 4055 OFF} // will silence the unit2 hint but not the unit1 hint
interface
//{$WARN 4055 OFF} // will silence the unit2 hint but not the unit1 hint
function convert_it(avalue:longint):pointer;
//{$WARN 4055 OFF} // will silence the unit2 hint but not the unit1 hint
implementation
//{$WARN 4055 OFF} // will silence the unit2 hint but not the unit1 hint
uses
 unit2;
//{$WARN 4055 OFF} // will silence the unit1 hint but not the unit2 hint
function convert_it(avalue:longint):pointer;
begin
 result:=pointer(do_it(avalue));
end;

end.

第二单元:

unit Unit2;
//{$WARN 4055 OFF} // will silence the unit2 hint but not the unit1 hint
interface
//{$WARN 4055 OFF} // will silence the unit2 hint but not the unit1 hint
function do_it(avalue:longint):longint;
//{$WARN 4055 OFF} // will silence the unit2 hint but not the unit1 hint
implementation
//{$WARN 4055 OFF} // will silence the unit2 hint but not the unit1 hint
function do_it(avalue:longint):longint;
var
 p:pointer;
begin
 p:=pointer(avalue);
 if p=nil then
  result:=avalue+1
 else
  result:=avalue-1;
end;

end.

1 个答案:

答案 0 :(得分:1)

来自manual

  

本地指令可以在单元或程序中多次出现,如果   它们有一个命令行对应,命令行参数是   恢复为每个编译文件的默认值。当地指令   从遇到的那一刻开始影响编译器的行为   直到另一个开关消灭他们的行为,或者   到达当前单位或计划的结尾。

因此,在恢复默认值之后,您使用的指令在声明到 a 单元结尾后有效,遵循使用子句。

对于每个单位,对于每个第n个指令

  • 计划
    • 1:该指令已激活,仍然在 unit1 中有效,因为使用,因使用而在 unit2 中仍然有效。但在 unit2 (单位结束)之后,默认值会恢复,因此您会收到 unit1 中的消息。
    • 2:该指令在使用后被激活,因此无论该单位是什么都没有效果。
  • 1单元
    • 1:由于使用,指令已激活,仍然在 unit2 中有效。但在 unit2 (单位结束)之后,默认值会恢复,因此您会收到 unit1 中的消息。
    • 2:ditto
    • 3:ditto
    • 4:ditto
    • 5:该指令仅针对 unit1 实施部分激活。
  • Unit2,所有情况:该指令仅针对 unit2 激活。

到达这里的棘手问题是它遵循使用