Когда вы используете условную компиляцию, препроцессор добавляет код в вашу программу перед этапом компиляции. Итак, если символ _WIN32 существует, то вы фактически говорите
printf("Running on Windows");
void test(int x);
int main() {
return 0;
}
, и это синтаксически неверно, поскольку у вас есть исполняемый код (вызов printf) вне всех функций.
Если у вас не было проблем до того, как вы добавили «#else», это произошло потому, что символ _WIN32 не существует, а препроцессор не добавил оператор printf в ваш код.