Nested function requires forward declaration?

Chris Katko ckatko at gmail.com
Thu Apr 14 08:55:25 UTC 2022


Using DMD. v2.098-beta-2

Not sure if right terminology. But I just wrote a nested function 
that uses a variable outside its body. The capture (right term?) 
is obvious where the invocation is. However, I have to move the 
declaration of the variable to above the nested function for it 
to compile.

Here is the code that wont compile:
````D
void execute()
	{
	bool isKey(ALLEGRO_KEY key)
		{
		return (event.keyboard.keycode == key);
		}
	ALLEGRO_EVENT event;
	// later
	isKey(ALLEGRO_KEY_W);

// main.d(491): Error: undefined identifier `event`
````

This however, will compile:
````D
void execute()
	{
	ALLEGRO_EVENT event; // <--Only change
	bool isKey(ALLEGRO_KEY key)
		{
		return (event.keyboard.keycode == key);
		}
	// later
	isKey(ALLEGRO_KEY_W);
````

It appears the nested function's variable capture depends on 
forward declaration (the right term?). Whereas, I was under the 
impression most/all of D worked on a multiple pass compilation so 
the order of declarations shouldn't matter.

Is this a D spec, or a compiler parsing error/oversight?

I guess if I had two different variables called event, this could 
become confusing code to read except that, mentally these should 
still link up, right?

Hypothetical:
````D
void execute()
{
bool isKey(ALLEGRO_KEY key)
	{
	return (event.keyboard.keycode == key);
	}

    {
    ALLEGRO_EVENT event;
    isKey(ALLEGRO_KEY_W);
    } //lets say this does some memory housekeeping/deleting so 
that's why we use scope
    {
    ALLEGRO_EVENT event; //new 'event', same name, new memory
    isKey(ALLEGRO_KEY_W);
    }
}
````

in this case, 'event' under-the-hood could be renamed, say, 
"event2" and have the same expected compile time symbol linking 
occur. The second isKey call is obviously connected to the second 
'event' variable.

I imagine this is a really odd edge case but it's piqued my 
interest.


More information about the Digitalmars-d-learn mailing list