How can I express the type of a function in D?

Ali Çehreli acehreli at yahoo.com
Wed Jan 30 18:39:21 UTC 2019


On 01/30/2019 07:47 AM, Steven Schveighoffer wrote:
 > On 1/30/19 12:14 AM, Sobaya wrote:
 >> I want to get a mangled name of a D function by
 >> `core.demangle.mangle`, but I'm in trouble because there are no ways
 >> to express a type of a function, which is used for a template argument
 >> of `mangle`.
 >>
 >> For example, it is wrong to use the type `int function(int,int)` to
 >> express the type of `int add(int,int)`.
 >> Because it expresses the type of a function POINTER, not just a 
function.
 >>
 >> The fuction name in a binary compiled this function is "_D3addFiiZi",
 >> but `mangle!(int function(int,int))("add")` returns "_D3addPFiiZi",
 >> which includes "P" meaning POINTER.
 >>
 >> How can I get the former one?
 >
 > Why not use add.mangleof?
 >
 > -Steve

add.mangleof includes the module name as well (_D6deneme3addFiiZi) but 
the OP wanted without (_D3addFiiZi). I wonder why the inconsistency. On 
the other hand, .mangleof produces just "add" when the function is 
extern(C). (?)

import core.demangle;

extern(C) int add(int, int);

void main() {
   alias F = typeof(add);
   pragma(msg, mangle!F("add"));
   pragma(msg, add.mangleof);
}

Output:

_D3addUiiZi
add               <-- Is that correct?

Ali



More information about the Digitalmars-d-learn mailing list