There are several ways to solve that, but I would probably do it like this:
%define link 0 ; or %assign, doesn't matter in this case
; ...
construct:
%define link construct
; ...
This assumes that your code really contains a label like "construct" each time that you want to re-define link. So, a second re-definition would have to look somewhat like this (as labels must be unique, you cannot re-use the label "construct"):
second_construct:
%define link second_construct
; ...
It might require less typing or be easier to implement in your code to use
macro-local labels or
context-local labels. For example, using macros along the former:
%define link 0
%macro constructlabel 0
%%construct:
%define link %%construct
%endmacro
; ...
constructlabel
; ...
constructlabel
; ...
Notice how the macro is used multiple times, but in fact defines a different label each time. "link" is re-defined (in the preprocessor) to the last defined label's name. If you use a macro to create your constructs (the "; ..." parts) anyway, then you could include the two lines in my example's macro at the beginning of your macro instead of using two separate macros.
This mechanism could be implemented using context-local labels instead.