The interrupt vector table is an array of function pointers, and on most platforms it's defined in C startup code that references each handler by its plain, unmangled name, e.g. the table entry is the symbol SysTick_Handler. If you write that handler in a C++ file without extern "C", the compiler mangles its name (encoding its signature), so the symbol the startup code expects (SysTick_Handler) doesn't exist, and the linker either errors or, worse, the weak default handler is used and your ISR silently never runs. Declaring it extern "C" void SysTick_Handler(void) forces C linkage so the name matches the vector table entry. The same reasoning applies to any C++ function that C code calls by name.
C++ for Embedded · Interview question
Why must an interrupt handler written in C++ usually be declared extern "C"?
A strong answer
What a weak answer sounds like
You know the answer. Do you know what gets you dinged?
Pro breaks down the answer most candidates actually give to this question — and the specific reason an interviewer marks it down. It’s the difference between sounding correct and sounding senior, on all 472 questions.
From the lesson
C++ vs C for Embedded
What C++ adds over C on a microcontroller: classes, RAII, templates, references, and the zero-overhead principle that makes those abstractions free.