For the sake of readability
I don't see how this will make your code more readable.
It will only introduce complexity, and I think it won't be useful anyway, because the initialize(x) macro will only work if no statement has been executed in the function it is "called" from. The preprocessor will replace each "call" to a macro, with the macro's "body". That is, after preprocessing, your code will look like this:
int main() {
(type example = initfunction()); /* notice the parentheses! */
example.item = 0;
return 0;
}
See now why it doesn't compile?
If you want your code to compile, then you should change your intitialize(x) macro definition to: #define initialize(x) type x = initfunction()
.
But keep in mind that I'm not for such programming practices, it obscures your code and introduces errors.
[EDIT]
When strictly adhering to the C89 standard, this won't even compile:
#define initialize(x) type x = initfunction()
int main() {
initialize(example);
example.item = 0;
initialize(temp);
return 0;
}
Why? Because the standard forbids it.
[/EDIT]