mag*_*nus 4 delphi macros preprocessor symbols
在Delphi中,您可以定义符号,就像在C/C++中一样.
德尔福:
{$DEFINE MY_SYMBOL}
Run Code Online (Sandbox Code Playgroud)
C/C++:
#define MY_SYMBOL
Run Code Online (Sandbox Code Playgroud)
这允许您通过{$IFDEF MY_SYMBOL}
在Delphi或#ifdef MY_SYMBOL
C/C++中使用来检查符号是否已定义.
这是一个布尔值 - 符号是在预处理期间定义的.但是,C/C++还允许您为预处理器符号赋值.例如:
#ifdef DEBUG
#define DB_HOST "127.0.0.1"
#else
#define DB_HOST "123.456.789.123"
#endif
Database *pDatabase = new Database(DB_HOST);
Run Code Online (Sandbox Code Playgroud)
是否可以在Delphi中为预处理器符号赋值,或者Delphi是否仅允许您确定是否已定义符号?
编辑:由于Delphi不支持预处理器中的符号值,我假设它不支持预处理器宏.我在这个假设中是对的吗?
例如,在C中,您可以定义一个预处理器宏,在编译之前将其与适当的参数一起复制和粘贴.当您希望"内联函数"功能用于快速操作(例如,二进制逻辑,在整数值中测试,位移等)而没有堆栈帧的开销,参数传递等时,这非常有用.
#define OK_FLAG 0x00000001
#define OK(f) (f & OK_FLAG)
#define WEAK_XOR_CIPHER(v) (v ^ 0xff)
Run Code Online (Sandbox Code Playgroud)
您可以简单地使用常量,并定义值:
const
{$IFDEF DEBUG}
DB_Host = '127.0.0.1';
{$ELSE}
DB_Host = '123.45.67.89';
{$ENDIF}
Run Code Online (Sandbox Code Playgroud)
你也可以反过来做(的东西测试没有被定义):
const
{$IFNDEF DEBUG}
DB_Host = '123.45.67.89';
{$ELSE}
DB_Host = '127.0.0.1';
{$ENDIF}
Run Code Online (Sandbox Code Playgroud)
这可确保DB_Host
始终可用,并在不调试时具有适当的值.
最新版本的Delphi允许您测试常量的值.例如,系统单元已RTLVersion
定义常量,您可以使用它测试值:
{$IF RTLVersion <= 26}
// Less than XE5
{$ELSE}
// XE5
{$IFEND}
Run Code Online (Sandbox Code Playgroud)
但是,Delphi不支持任何类型的宏.没有宏的典型解决方案是使用内联函数.例如,请参阅Windows
单元的WinAPI RGB
宏实现:
function RGB(r, g, b: Byte): COLORREF; inline;
function RGB(r, g, b: Byte): COLORREF;
begin
Result := (r or (g shl 8) or (b shl 16));
end;
Run Code Online (Sandbox Code Playgroud)