Usually when defining pointer to shared memory outside the kernel function means that You want dynamic shared memory allocation (one of the kernel call parameter, as far as I remember). But in such case it would look like this:
__shared__ extern int arr[];
Thus, I really don’t know should there be a formal diffrence between the definitions You mentioned. Is CUDA C Programming Guide not refering to the issue?