在C/c++中,我们有预处理器指令(参见问题标题)。它们在D语言中的类比是什么?以及如何在编译时检测操作系统类型(Windows, Linux, Mac OS X, FreeBSD,…)和处理器类型(例如:32位或64位)?
更新:最好的答案已经在dlang.org: http://dlang.org/pretod.html .
D没有预处理器。相反,它提供了强大的编译时计算和自省功能。
下面是一个简单的C/c++到D语言的典型翻译列表,以及相关文档的链接:
C/c++ : #ifdef
, #ifndef
, #else
, #elif
D: version
[link]
C/c++ : #if <condition>
D: static if
[link]
C/c++ : #define
D: D的翻译取决于具体情况。
简单的C/c++定义,如#define FOO
被翻译成D的"版本"。示例:version = FOO
像#define BAR 40
这样的代码被翻译成下面的D代码:enum BAR 40
或者在极少数情况下你可能需要使用alias
。
复杂的定义像#define GT_CONSTRUCT(depth,scheme,size)
((depth) | (scheme) | ((size) << GT_SIZE_SHIFT))
被翻译成D的模板:
// Template that constructs a graphtype
template GT_CONSTRUCT(uint depth, uint scheme, uint size) {
// notice the name of the const is the same as that of the template
const uint GT_CONSTRUCT = (depth | scheme | (size << GT_SIZE_SHIFT));
}
(取自维基百科的例子)
C/c++ : #undef
D:我知道没有足够的翻译
#if condition
被static if(condition)
取代(有更多的编译时间计算)
#ifdef ident
被version(ident)
代替
#define ident
替换为version = ident
#define ident replacement
替换为alias ident replacement
更多信息请访问http://dlang.org/version.html和预定义的版本定义列表
这可能对C/D中的预处理器指令有一些用处:http://dlang.org/pretod.html
关于操作系统和处理器类型的检测,这个线程看起来可能会回答你的问题:http://forum.dlang.org/thread/mailman.616.1387191250.3242.digitalmars-d-learn@puremagic.com?page=1
注意:我熟悉C/c++,但不熟悉d。如果我的答案不充分,请告诉我,以便我修改它。希望我给你指出了正确的方向。
模拟下面是对符号existens的测试:
如果没有定义FT_THROW
,则定义默认函数FT_THROW。这是与ifndef类似的通用代码。
import std.stdio;
// my implementation of FT_THROW
void FT_THROW( int x ) { writeln( "calling redefined FT_THROW(): ", x*x ); }
// ifndef FT_THROW
static if ( !is( typeof( FT_THROW ) ) )
{
pragma( msg, "FT_THROW not exists. using default implementation." );
// default implementation of FT_THROW
void FT_THROW( int x ) { writeln( "call FT_THROW(): ", x ); }
}
void main()
{
// ifdef FT_THROW
static if ( is( typeof( FT_THROW ) ) ) // checking for FT_THROW extsts
{
pragma( msg, "FT_THROW found" );
}
FT_THROW( 7 );
}
在线:https://run.dlang.io/is/N3ENqb
真实的例子:
#ifndef FT_MEM_ZERO
#define FT_MEM_ZERO( dest, count ) FT_MEM_SET( dest, 0, count )
#endif
static if ( !is( typeof( FT_MEM_ZERO ) ) )
{
auto FT_MEM_ZERO( T1, T2 )( T1 dest, T2 count ) { FT_MEM_SET( dest, 0, count ); }
}
示例2:
#ifndef TRUE
#define TRUE 1
#endif
static if ( !is( typeof( TRUE ) ) )
enum TRUE = 1;