On Friday, 14 April 2023 at 14:10:41 UTC, Leonardo wrote:
Thanks. But this works only to one function per time. Is there any way to do this to an imported library at all? something like `@trusted import library`

No, there isn't. C is an unsafe language, so if you want to call C from `@safe` code, you have to do the work to make sure that each individual call is `@safe`.

If you are calling the same C function many times from `@safe` code, you can write a `@trusted` D wrapper function to avoid repeating the safety checks at every call site. For example, here's a `@trusted` wrapper for the standard C library function `puts`:

```d
import core.stdc.stdio: puts;
import std.exception: enforce;

@trusted
void safePuts(const(char)[] s)
{
    // To safely call puts, we must pass it a valid C string
// To be a valid C string, s must be non-empty and NUL-terminated
    enforce(s.length > 0, "An empty string is not a C string");
    enforce(s[$-1] == '\0', "A C string must be NUL-terminated");

    // If the checks above have passed, this call is safe
    puts(&s[0]);
}
```

Reply via email to