On 28 January 2012 17:03, Robert Clipsham <robert@octarineparrot.com> wrote:
On 28/01/2012 14:50, Manu wrote:
This has come up lots of times before.. I just wanted to effectively +1
this request.
I have some templates, and some reasonably complex functions I use
strictly via CTFE to produce enums and evaluate conditions within the
templates.
When I build my code, I notice that the CTFE functions, which are never
referenced in any runtime code, are still present in the object file.
Additionally, one of these functions requires I import std.string, which
is only used in CTFE code, and is otherwise a pointless import.
I'd certainly like to be able to mark these functions CTFE to be sure no
runtime code will ever be generated for them, and also, what can I do
about CTFE imports? I don't want that import in my binary...
There are a couple of things you can do. The first is to make the imports function local, the second is:
http://www.digitalmars.com/d/archives/digitalmars/D/Incremental_compilation_with_DMD_96138.html#N96337
You'll notice that thread mentions a pragma(ctfe) patch for DMD, that's another option, though would require a patched compiler. I can't seem to find a link to that patch, a bit of googling should help though.
Another idea I've just had:
T myComplexFuntion()
{
if (__ctfe)
{
// Implement here
}
else
{
assert(0);
}
}
This should allow the function to be inlined to assert(0); if it's called at runtime, so while it will still exist in the binary, it won't introduce lots of additional bloat.
Sweet, I'll do that for now.
You mean static if() right?