std :: to_string не объявлена ​​ошибка компиляции в AIX

Я компилирую свой код в 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()");

Этот макрос предназначен для регистрации

0

Решение

Я не уверен, сколько поддержки последних 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.
0

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector