例如,C11规定size_t应在以下头文件中声明:
在阅读C11时,我发现在多个标准头文件中声明了许多其他数据类型.
size_t.为什么不只是stddef.h为了简单?size_t在那些头文件中实现.它们是否保证在这些头文件中具有相同的定义?我不是Pascal新手,但直到现在我仍然不知道为什么Delphi和Free Pascal通常声明参数并将值返回为有符号整数,而我看到它们应该始终是正数.例如:
Pos()返回Integer的类型.有可能成为负面的吗?SetLength()将NewLength参数声明为Integer的类型.字符串是否有负长度?System.THandle宣称为Longint.手柄有负数吗?有许多决定,如Delphi和Free Pascal.这背后有什么考虑因素?
以下C函数来自fastapprox项目.
static inline float 
fasterlog2 (float x)
{
  union { float f; uint32_t i; } vx = { x };
  float y = vx.i;
  y *= 1.1920928955078125e-7f;
  return y - 126.94269504f;
}
有些专家可以解释一下为什么上面代码中使用的指数偏差是126.94269504而不是127?是否更准确的偏差值?
我在"source\common\unicode\utf.h"ICU库(International Components for Unicode)的文件中发现了一个有趣的小问题.钻头用于检查数字是否在特定范围内.
// Is a code point in a range of U+d800..U+dbff?
#define U_IS_LEAD(c) (((c)&0xfffffc00)==0xd800)
我已经想出了幻数(0xfffffc00)来自:
MagicNumber = 0xffffffff - (HighBound - LowBound)
但是,我还发现该公式不适用于每个任意范围.这里有人知道公式在什么情况下有效吗?
还有另外一点是为了检查一个数字是否在特定范围内吗?
typedef struct _FILE_OBJECTID_INFORMATION {
    LONGLONG FileReference;
    UCHAR ObjectId[16];
    union {
        struct {
            UCHAR BirthVolumeId[16];
            UCHAR BirthObjectId[16];
            UCHAR DomainId[16];
        } DUMMYSTRUCTNAME;
        UCHAR ExtendedInfo[48];
    } DUMMYUNIONNAME;
} FILE_OBJECTID_INFORMATION, *PFILE_OBJECTID_INFORMATION;
如何将这样的联盟翻译成Delphi?
注意Exit内联函数中的命令用法!我一直在这里使用Delphi XE3.
在某些情况下,当呼叫到包含一个内联函数取得Exit命令,并返回值的内联函数的用于直接在WriteLn(),编译器报告的错误消息,
"dcc"退出代码1.
甚至最糟糕的是,Delphi IDE在没有任何确认的情况下终止.
function ProcessNumber(const iNumber: Integer): Boolean; inline;
begin
  if iNumber = 0 then begin
    Result := False;
    Exit;
  end;
  // some code here ...
  Result := True;
end;
procedure Test;
begin
  writeln( ProcessNumber(0) );
end;
begin
  Test;
  ReadLn;
end.
但是,如果内联函数的返回值存储在变量中,然后使用该变量WriteLn(),则不会发生该问题.
procedure Test;
var
  b: Boolean;
begin
  b := ProcessNumber(0);
  writeln(b);
end;
我有许多单元包含许多条件指令块,例如:
{$IFDEF DELPHI6ANDLOWER}
  *Do something 1*
{$ELSE}
  *Do something 2*
{$ENDIF}
现在,我决定放弃对Delphi 6(VER140)和更低版本的支持.
有没有可以发挥魔力的工具?希望上面的代码变成:
  *Do something 2*
我测试过ModelMaker,CnPack,GExperts,但是没有一个能够做到这一点.
让我们回到基础.坦率地说,我之前从未使用New和Dispose运作过.但是,在我阅读了Embarcadero技术网站上的New()文档和包含的示例以及New()的Delphi Basics解释之后,它在我脑海中留下了一些问题:
System.New()除了节省少量内存之外,使用而不是局部变量有什么好处?
常用代码示例New()或多或少如下:
  var
      pCustRec : ^TCustomer;
  begin
      New(pCustRec);
      pCustRec^.Name := 'Her indoors';
      pCustRec^.Age  := 55;
      Dispose(pCustRec);
  end;
在什么情况下上面的代码比下面的代码更合适?
  var
      CustRec : TCustomer;
  begin
      CustRec.Name := 'Her indoors';
      CustRec.Age  := 55;
  end;
在Windows.pas,有:
  LARGE_INTEGER = record
    case Integer of
    0: (
      LowPart: DWORD;
      HighPart: Longint);
    1: (
      QuadPart: LONGLONG);
  end;
  TLargeInteger = Int64;
我看到几个Windows函数和结构成员最初声明为LARGE_INTEGER已被翻译为TLargeInteger如下:
  function QueryPerformanceCounter(var lpPerformanceCount: TLargeInteger): BOOL;
      stdcall;
另一个例子是:
  WIN32_STREAM_ID = record
    dwStreamId        : DWORD;
    dwStreamAttributes: DWORD;
    Size              : TLargeInteger;
    dwStreamNameSize  : DWORD;
    cStreamName       : array[0..0] of WCHAR;
  end;
可以TLargeInteger作为LARGE_INTEGERWindows头文件中找到的每个函数参数和结构成员的替代吗?
以下代码在我的系统中按预期运行,但我不确定P变量是否保证在MyArray[0]更改为新值后具有相同的值.
procedure Test;
var
  MyArray: array of string;
  P : PChar;
begin
  SetLength(MyArray, 2);
  MyArray[0] := 'ABCD';
  MyArray[1] := '1234';
  // Is P guaranteed to have the same value all the time?
  P := PChar(MyArray[0]);
  MyArray[0] := MyArray[1];
  MyArray[1] := P;
  WriteLn(MyArray[0]);
  WriteLn(MyArray[1]);
end;