更新:最佳答案已经在dlang.org上了:http://dlang.org/pretod.html。
D语言没有预处理器。相反,它提供了强大的编译时评估和内省能力。
以下是一个简单的C/C++到D语言翻译列表,其中包含相关文档的链接:
C/C++:#ifdef
、#ifndef
、#else
、#elif
D:version
[链接]
C/C++:#if <condition>
D:static if
[链接]
C/C++:#define
D:D语言的翻译取决于具体情况。
像#define FOO
这样的简单C/C++定义被翻译成D语言的"version"。例如: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。如果我的回答不足,请告诉我,以便我进行更改。希望我能指导你朝正确的方向前进。
模拟 ifndef。 这里是检测符号存在的测试:
如果未定义 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 ); }
}
#ifndef TRUE
#define TRUE 1
#endif
是
static if ( !is( typeof( TRUE ) ) )
enum TRUE = 1;
#if defined(X)
是什么意思? - user1461607