On Wed, Apr 12, 2023 at 08:23:51PM +0000, rempas via Digitalmars-d-learn wrote: > Sorry if the title doesn't make any sense, let me explain. So, I do have the > following code that does not compile: > > ```d > import core.sys.posix.pthread; /* The library */ > > struct Thread { > private: > pthread_t thread_id; > > public: > this(void* function(void*) func, void* arg = null, scope > const(pthread_attr_t*) attr = null) { > pthread_create(&this.thread_id, attr, func, arg); > } > > @property: > pthread_t id() { return this.thread_id; } > } > > ``` > > Yes, I'm trying to "encapsulate" the Pthread (POSIX threads) API. > Normally, the function pointer that is passed to "pthread_create" must > be "extern(C)" and this is the complaining that the compile does. So, > I'm thinking to replace the constructor to this: > > ```d > this(extern(C) void* function(void*) func, void* arg = null, > scope const(pthread_attr_t*) attr = null) > { pthread_create(&this.thread_id, attr, func, arg); } > ``` > > I just added "extern(C)" before the type. This is how it looks in the > error message so it must work right? Well... it doesn't. And here I am > wondering why. Any ideas?
IMO this is a bug either in D's syntax or in the parser. I'd file an enhancement request. In the meantime, you can use alias as a workaround: -------snip------- extern(C) void* abc(void*) {return null;} alias FuncPtr = typeof(&abc); pragma(msg, typeof(abc)); pragma(msg, typeof(&abc)); //void wrapper(extern(C) void* function(void*) callback) {} // NG void wrapper(FuncPtr callback) {} // OK pragma(msg, typeof(wrapper)); -------snip------- T -- A programming language should be a toolbox for the programmer to draw upon, not a minefield of dangerous explosives that you have to very carefully avoid touching in the wrong way.