首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >dcc32警告UnloadProcs.pas(59):函数'GetType‘的W1035返回值可能未定义

dcc32警告UnloadProcs.pas(59):函数'GetType‘的W1035返回值可能未定义
EN

Stack Overflow用户
提问于 2012-12-19 22:07:25
回答 3查看 324关注 0票数 1

有一种数据类型

代码语言:javascript
复制
type
TDataTypeId = (DataTypeId_String, DataTypeId_SmallInt, DataTypeId_Integer, DataTypeId_Word,
               DataTypeId_Boolean, DataTypeId_Float, DataTypeId_Currency,
               DataTypeId_BCD, DataTypeId_FmtBCD, DataTypeId_Date,
               DataTypeId_Time, DataTypeId_DateTime, DataTypeId_TimeStamp,
               DataTypeId_Bytes, DataTypeId_VarBytes, DataTypeId_Blob,
               DataTypeId_Memo, DataTypeId_Graphic, DataTypeId_fmtMemo,
               DataTypeId_FixedChar, DataTypeId_WideChar, DataTypeId_LargeInt,
               DataTypeId_Array, DataTypeId_FixedWideChar, DataTypeId_WideMemo);

有一个函数,它接受包含此类型的值之一的行,返回此值

代码语言:javascript
复制
Function GetType(str: string): TDataTypeId;
var
typeidx: TDataTypeId;
typestr: string;
begin
for typeidx := Low(TDataTypeID) to High(TDataTypeID) do
 begin
  typestr:=GetEnumName(TypeInfo(TDataTypeId),Ord(typeidx));
  typestr:=Copy(typestr, 12, length(typestr)-11);
  //Memo.Lines.Add(typestr+'\n');
  if (AnsiCompareStr(str, typestr)=0) then
     Result:=typeidx
 end;
 end;

因此,会有一个程序集

代码语言:javascript
复制
[dcc32 Warning] UnloadProcs.pas(59): W1035 Return value of function 'GetType' might be undefined

如何转换没有出现警告的函数?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-12-19 22:14:25

编译器警告是准确的。如果If语句的计算结果永远不会为True,因为找不到匹配项,则循环不会将其赋值给Result。然后函数退出,不赋值。

您的选择:

  1. 在循环完成后为Result赋值,表示找不到匹配项。
  2. 在循环完成后引发异常。

我还建议您在分配Result之后立即执行exit。当你找到答案后,继续循环是没有意义的。

我可能会这样写这个函数:

代码语言:javascript
复制
Function GetType(str: string): TDataTypeId;
var
  typestr: string;
begin
  for Result := low(Result) to high(Result) do
  begin
    typestr := GetEnumName(TypeInfo(TDataTypeId),Ord(typeidx));
    typestr := Copy(typestr, 12, length(typestr)-11);
    if AnsiSameStr(str, typestr) then
      exit;
  end;
  raise EEnumNotFound.CreateFmt('Enum not found: %s', [str]);
end; 

注意,Result变量用作循环变量。这是惯用的,其好处是减少了声明的局部变量的数量。

我同意您可以使用GetEnumValue更有效地解决您的问题,但我想向您展示如何以惯用的方式处理编译器警告。

票数 5
EN

Stack Overflow用户

发布于 2012-12-19 22:25:55

关于在这样的循环中使用result的一般方法,下面是您可以如何编写函数的代码:

代码语言:javascript
复制
Function GetType(const str: string): TDataTypeId;
var
typestr: string;
begin
 for result := Low(TDataTypeID) to High(TDataTypeID) do
 begin
  typestr:=GetEnumName(TypeInfo(TDataTypeId),Ord(result));
  typestr:=Copy(typestr, 12, length(typestr)-11);
  //Memo.Lines.Add(typestr+'\n');
  if (AnsiCompareStr(str, typestr)=0) then
     exit; // if found, returns result value
 end;
 result := DataTypeId_String; // returns STRING type by default
end;

这是仅有的可以在循环范围之外使用循环变量的情况之一。生成的代码是正确的,并且经过优化。

我认为您应该更好地定义一个专用的TDataTypeId项,比如DataTypeId_Unknown,或者如果找不到它就引发一个异常。

票数 1
EN

Stack Overflow用户

发布于 2012-12-19 22:21:26

其他人已经解释了这个警告,但更好的实现例程应该是这样的:

代码语言:javascript
复制
uses
  TypInfo, ConvUtils;

Function GetType(str: string): TDataTypeId;
var idx: Integer;
begin
  idx := GetEnumValue(TypeInfo(TDataTypeId), 'DataTypeId_'+str);
  if(idx <> -1)then Result := TDataTypeId(idx)
  else RaiseConversionError('Unknown typeID name: '+str);
end;

也就是说,不需要遍历所有枚举值并将它们作为字符串进行比较,而是使用GetEnumValue函数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13954116

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档