Как заставить препроцессор генерировать строку для ключевого слова __LINE__?
__FILE__
заменяется на "MyFile.cpp" препроцессором С++.
Я хочу, чтобы __LINE__
заменялся строкой "256", не содержащей 256 целых чисел.
Без использования моих собственных письменных функций, таких как
toString(__LINE__);
Это возможно? Как я могу это сделать?
VS 2008
EDIT Я бы хотел автоматически найти и заменить все throw;
с помощью
throw std::runtime_error(std::string("exception at ") + __FILE__ + " "+__LINE__);
в моих источниках. Если я использую макрос или функцию для преобразования __LINE__
в строку, мне нужно будет изменить каждый исходный файл вручную.
Ответы
Ответ 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());
}