D编程语言中"#ifdef"、"#ifndef"、"#else"、"#elif"、"#define"、"#undef"的类似物是什么?



在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 conditionstatic if(condition)取代(有更多的编译时间计算)

#ifdef identversion(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;

相关内容

  • 没有找到相关文章