The reason you can't do away with the curly braces is to do with scope. A named variable refers to one previously declared in the same scope, or closest outer scope. You can have variables with the same name in different scopes (they don't even have to be the same type), in which case the one currently visible (eg declared in the same or closest outer scope) hides the others.
Put simply, the extern keyword in this case tells the compiler to use the "x" declared in the global scope, not the one closest.
int x = 5;
int func()
{
int x = 4;
{
extern int x; return x;
}
}
If you throw away the braces, you have two "x" in the same scope - both the local and the global - and that is an error.