Речь не о внешних переменных. В C переменные со статическим хранилищем должны иметь постоянные инициализаторы. В С ++ их может быть практически любое. Разница в том, что объекты C ++ имеют конструкторы, и объект можно инициализировать практически любым способом (например, с помощью вызова метода или функции).
в C ++ возможна такая инициализация:
#include <string.h>
volatile char s[] = "sdfsasdf";
size_t size = strlen((char *)s);