Подтвердить что ты не робот

Как заставить препроцессор генерировать строку для ключевого слова __LINE__?

__FILE__ заменяется на "MyFile.cpp" препроцессором С++. Я хочу, чтобы __LINE__ заменялся строкой "256", не содержащей 256 целых чисел. Без использования моих собственных письменных функций, таких как

toString(__LINE__);

Это возможно? Как я могу это сделать?

VS 2008

EDIT Я бы хотел автоматически найти и заменить все throw; с помощью

throw std::runtime_error(std::string("exception at ") + __FILE__ + " "+__LINE__);

в моих источниках. Если я использую макрос или функцию для преобразования __LINE__ в строку, мне нужно будет изменить каждый исходный файл вручную.

4b9b3361

Ответ 1

Вам нужен трюк с двойным расширением:

#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 (неявно) во время выполнения, но это неизбежно.

Ответ 2

РЕДАКТИРОВАТЬ. В ответ на запрос по другому ответу я добавил не-макро версию:

#include <iostream>
#include <boost/lexical_cast.hpp>
#include <string>

#define B(x) #x
#define A(x) B(x)

void f(const char *s) {
std::cout << s << "\n";
}

int main() {

   f(A(__LINE__));
   f(boost::lexical_cast<std::string>(__LINE__).c_str());
}