Thread overview | |||||||
---|---|---|---|---|---|---|---|
|
June 05, 2013 Global extern(C) in druntime header files? | ||||
---|---|---|---|---|
| ||||
I've been doing some coding and noticed something strange with core.sys.posix.signal. In the following snippet you will see that i have to decorate the handleTermination function with extern(C) to satisfy the type requirements of the bsd_signal function. import core.sys.posix.signal; import std.c.stdlib; import std.stdio; void main(string[] args) { bsd_signal(SIGINT, &handleTermination); while (true) { } } extern(C) void handleTermination(int signal) { writefln("Caught signal: %s", signal); exit(signal); } This seems really odd until you take a look at the header file. In signal.d you will see extern(C): specified at the top and then further down this: private alias void function(int) sigfn_t; essentially decorating this alias with extern(C). Is this right? Should this alias be decorated like that in the header file? |
June 05, 2013 Re: Global extern(C) in druntime header files? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Gary Willoughby | Not going to look into the file, but I'm pretty sure bsd_signal is function for an external C library right? If that is the case, it must use C calling convention, so yes this is correct. |
June 05, 2013 Re: Global extern(C) in druntime header files? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jesse Phillips | On Wednesday, 5 June 2013 at 18:54:45 UTC, Jesse Phillips wrote:
> Not going to look into the file, but I'm pretty sure bsd_signal is function for an external C library right?
>
> If that is the case, it must use C calling convention, so yes this is correct.
Ah sorry i wasn't clear.
The question i have is, why do i need to decorate the function (with extern(C)) that i pass to bsd_signal.
The only reason i can see is that the type hint is decorated but surely it doesn't need to be.
|
June 06, 2013 Re: Global extern(C) in druntime header files? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Gary Willoughby | On Wednesday, 5 June 2013 at 20:40:59 UTC, Gary Willoughby wrote:
> On Wednesday, 5 June 2013 at 18:54:45 UTC, Jesse Phillips wrote:
>> Not going to look into the file, but I'm pretty sure bsd_signal is function for an external C library right?
>>
>> If that is the case, it must use C calling convention, so yes this is correct.
>
> Ah sorry i wasn't clear.
>
> The question i have is, why do i need to decorate the function (with extern(C)) that i pass to bsd_signal.
>
> The only reason i can see is that the type hint is decorated but surely it doesn't need to be.
You are passing a function pointer to a C library, where it will be expected that the function uses the C calling convention. So you have to declare the function as extern(C), otherwise DMD will not compile it as such. That can cause segfaults.
|
June 06, 2013 Re: Global extern(C) in druntime header files? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Mike Parker | > You are passing a function pointer to a C library, where it will be expected that the function uses the C calling convention. So you have to declare the function as extern(C), otherwise DMD will not compile it as such. That can cause segfaults.
Right ok thanks.
|
Copyright © 1999-2021 by the D Language Foundation