如果我试图不加思索地使编译器消息无声,编译器命令行参数-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.
答案 0 :(得分:1)
来自manual:
本地指令可以在单元或程序中多次出现,如果 它们有一个命令行对应,命令行参数是 恢复为每个编译文件的默认值。当地指令 从遇到的那一刻开始影响编译器的行为 直到另一个开关消灭他们的行为,或者 到达当前单位或计划的结尾。
因此,在恢复默认值之后,您使用的指令在声明到 a 单元结尾后有效,遵循使用子句。
对于每个单位,对于每个第n个指令
到达这里的棘手问题是它遵循使用。