Вам нужен трюк с двойным расширением:
#define S(x) #x
#define S_(x) S(x)
#define S__LINE__ S_(__LINE__)
/* use S__LINE__ instead of __LINE__ */
Добавление, годы спустя: Хорошая идея - немного поработать над тем, чтобы избежать операций, которые могут выделить память в путях обработки исключений. Учитывая вышесказанное, вы должны быть в состоянии написать
throw std::runtime_error("exception at " __FILE__ " " S__LINE__);
, который будет выполнять конкатенацию строк во время компиляции, а не во время выполнения. Он по-прежнему будет создавать std :: string (неявно) во время выполнения, но это неизбежно.