[英]std::to_string is not declared compile error in aix
我正在AIX环境中编译我的代码。它使我错误“ 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()");
该宏用于记录目的
我不确定std::to_string()
对最新的xlC 14.1
(或您使用的任何版本)有多少支持。
如果支持不完整,则C具有一种可怕的双宏方法(a) ,可以将__LINE__
转换为C字符串,以便您可以像使用__FILE__
和message
项一样使用std::string
,它就会出现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
以便知道std::to_string()
C ++ 11编译器可以使用更受欢迎的方法。
(a)如果您对这种方法为何感兴趣,我将在下面进行解释。
按照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__
本身会扩展。
然后第二级通过# 3
将STR1(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.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.