No difference between #if and #ifdef

My unity version is 5.6.4f1 . And when I write a shader using #ifdef like this

[Toggle(USE_MAT_CAP_CUBE)] MatCapCube("Use mat cap cube to sim" , int) = 0

#pragma shader_feature USE_MAT_CAP_CUBE

	i.reflect.xy = i.reflect.xy * 0.5f + 0.5f;
	half3 skyColor = tex2D(_MatCap , i.reflect.xy) * _ReflectAmount;
	half3 skyColor = texCUBE(_Cube, i.reflect) * _ReflectAmount;

And when I change shader feature value , the appearance dont change .
I check this problem ,and use #if instead . And this shader feature works again .
see the similar problem
But !!! After few days , I open the project Again .and I find that there is no difference between #if and #ifdef . Even when I use #ifdef , it still works …Is there really any difference between #if and #ifdef ??? thanks.

Hey there,
I tried to reproduce your phenomenon using Unity 2017.2 but failed to trigger the same bug. Two different shader files with “#if” and “#ifdef” are implemented and meanwhile, all other properties and calculations are made sure to remain the same with the snippet you have provided, which results in the same effect — toggling in the inspector does make sense.
According to the Unity Official and NVIDIA CG implementation notes, #if and #ifdef are only different in logic combinations, e.g. AND, OR, and NOT. Hence they should yield the same result in your situation. A possible explanation of your experience could be a bug related to meta file which causes failure in writing updated toggle value of your shader attribute. However, since the phenomenon could not be successfully reproduced and furthermore it seems to have fixed itself on your circumstance, I personally doubt that this problem is neither rendering or shader-compiling related but rather possibly due to asset management.