Is there a way to replace Exception with as a macro in C?
Marco de Wild
admin at localhost.com
Tue Feb 19 06:21:43 UTC 2019
On Tuesday, 19 February 2019 at 05:50:04 UTC, yisooan wrote:
> I wonder there is the way as I said in the title. For instance,
>
> in C,
>> #define indexInvalidException Exception("The index is invalid")
>>
>> /* Do something with the macro here */
>> if (false)
>> indexInvalidException;
>
> This is allowed.
> But I want to do the exact same thing in D. I have already
> tried some expressions with alias? but it doesn't work.
>
>> alias indexInvalidException = Exception("The index is
>> invalid");
>>
>> /* Use the alias in somewhere */
>> if (false)
>> throw new indexInvalidException;
>
> Would you help me, please?
Alias is just a nickname for a symbol (i.e. alias string =
immutable(char)[];) and lets you refer to that symbol with the
nickname. You can't supply runtime parameters (like constructor
parameters), but you can give compile-time template parameters
(as the result of applying those parameters is a symbol rather
than a value). Macros on the other hand, do a textual
replacement, i.e. they alter the source code that goes into the
compiler.
Depending on how brief you want to make your code, you can either
use classic inheritance
class IndexInvalidException : Exception
{
this()
{
super("The index is invalid")
}
}
or, closest as you can get to macros:
enum throwNewIndexInvalidException = `throw new Exception("The
index is invalid");`;
void main()
{
mixin(throwNewIndexInvalidException);
}
String mixins transform a string into an expression, and paste
the expression wherever it is mixed in. It gets precompiled
rather than substituted in the source code. This means it's best
to have the whole line into a string, instead of individual parts
(you can't have a mixin with just `Exception("The index is
invalid")` for example).
More information about the Digitalmars-d-learn
mailing list