Я компилирую свой код в AIX env .. он дает мне ошибку «std :: to_string» не объявлено
успешно скомпилировал тот же код в Windows.
define LOG_MSG(message) CLogManager::LogMessage(CLogManager::CurrentDateTime() + " - " + std::string(__FILE__) + "[" + std::to_string(static_cast<_ULonglong>(__LINE__)) + "] : " + std::string(message) + "\n")
Это макрос, и я использую это как
LOG_MSG(" ** BEGIN StorePasswordFromFile()");
Этот макрос предназначен для регистрации
Я не уверен, сколько поддержки последних xlC 14.1
(или любую версию, которую вы используете) имеет для std::to_string()
,
Если поддержка не завершена, C имеет отвратительный метод двойного макроса (А) превращения __LINE__
в C-строку, так что вы можете просто использовать std::string
так же, как у вас есть для __FILE__
а также message
элементы, и кажется, что препроцессор C ++ остался верен своим отвратительным корням 🙂
Код:
#include <stdio.h>
#define STR1(x) # x
#define STR2(x) STR1(x)
int main(void) {
char x[] = __FILE__;
char y[] = STR2(__LINE__);
printf("file = %s, line = %s\n",x,y);
return 0;
}
выходы:
file = qq.c, line = 6
показывая, что __LINE__
был успешно преобразован в значение C-строки.
Вы должны быть в состоянии использовать подобный метод в вашем макросе:
#define STR1(x) # x
#define STR2(x) STR1(x)
#define LOG_MSG(message) CLogManager::LogMessage( \
CLogManager::CurrentDateTime() + " - " + \
std::string(__FILE__) + "[" + \
std::string(STR2(__LINE__)) + "] : " + \
std::string(message) + "\n")
int main() {
LOG_MSG ("My hovercraft is full of eels");
return 0;
}
Предварительная обработка с g++ -E qq.cpp
дает тебе:
CLogManager::LogMessage( CLogManager::CurrentDateTime() + " - " + std::string("qq.cpp") + "[" + std::string("10") + "] : " + std::string("My hovercraft is full of eels") + "\n");
(показывает только соответствующую строку), которая, кажется, соответствует тому, что вы хотите.
Как примечание стороны, так как вы, кажется, все в порядке, добавляя C-строки, как "["
без нужно явно создавать строки, я не уверен, что вы необходимость std::string()
звонки вообще для тех. Вам все еще нужен взлом макроса C, чтобы превратить целое число в C-строку, но, как только это будет сделано, вы сможете просто использовать все как есть.
Изменение окончательного макроса на:
#define LOG_MSG(message) CLogManager::LogMessage( \
CLogManager::CurrentDateTime() + " - " + \
__FILE__ + "[" + \
STR2(__LINE__) + "] : " + \
message + "\n")
дам тебе:
CLogManager::LogMessage( CLogManager::CurrentDateTime() + " - " + "qq.cpp" + "[" + "10" + "] : " + "My hovercraft is full of eels" + "\n");
Будь это хорошо идея, Я уйду к более широкому сообществу, но это, по крайней мере, решит вашу непосредственную проблему. Я бы, вероятно, поместил бы все это в #if/#else/#endif
так что компиляторы C ++ 11, которые знают о std::to_string()
можно использовать более приемлемый подход.
(А) Если вы заинтересованы в Зачем это работает, я объясню ниже.
#
а также ##
операторы макросов на самом деле имеют приоритет над рекурсивной природой замены макросов согласно C11 6.10.3.4 /1
:
После того, как все параметры в списке замены были заменены и # и ##
обработка выполнена, все маркеры предварительной обработки меток удалены.
результирующая последовательность токена предварительной обработки затем повторно сканируется вместе со всеми последующими
предварительная обработка токенов исходного файла для замены большего количества имен макросов.
Это означает, что код:
#define STR(x) # x
STR(__LINE__)
на самом деле приведет к "__LINE__"
поскольку #
случается первым и, как только это произошло, __LINE__
внутри строки литерал не подлежит дальнейшей замене. Выполняя двухэтапный процесс:
#define STR1(x) # x
#define STR2(x) STR1(x)
STR2(__LINE__)
первый уровень замены поворотов STR2(__LINE__)
в STR1(3)
так как __LINE__
сам по себе подлежит расширению.
Затем второй уровень превращается STR1(3)
, с помощью # 3
в "3"
,
Возможно, следующее может помочь:
#define STR1(x) # x
#define STR2a(x) STRn(x)
#define STR2b(x) STR1(x)
STR1(__LINE__)
STR2a(__LINE__)
STR2b(__LINE__)
Вывод этого, аннотированный, таков:
"__LINE__" - stringise, no further processing of __LINE__ inside literal.
STRn(6) - shows first stage of replacement, line number replacement.
"7" - shows full process.