On 4/20/21 2:57 PM, ichneumwn wrote:
Hi,
Trying to convert a C header to D. The underlying package exists in
different versions and may or may not expose certain functionality
(modules/extensions). One should check at compile time that the header
provides the relevant definitions, through #ifdef, and do a further
run-time check to confirm the functionality is really present. It is the
compile time check that I am finding tricky to do/emulate.
.h : #define i_am_a_feature 1
enum i_am_a_feature = true;
The C-code uses this define as a guard:
.c : #ifdef i_am_a_feature
static if(i_am_a_feature) {
...
}
So my questions:
- is there a module-crossing equivalent of "version"?
enum isn't exactly "module crossing", but it's defined within the
module, which means you can look at it from elsewhere.
- if not, is there some way I could test for the existence of the enum
can_i_test_for_this? A SymbolExists!() or ModuleHasSymbol!() or
ModuleHasMember!() ?
This is surprisingly tricky. A template will not accept a symbol by
alias that doesn't exist, and if you pass in a string and test, it will
test if that template can see the symbol, not your code. You can
probably do it inline:
static if(__traits(compiles, {alias x = doesThisExist;}));
-Steve