make报错:error: unable to find string literal operator ‘operator““fmt’ with ‘const char [12]’, ‘long u

在从X86迁移到ARM64架构时,遇到C++编译错误,原因是C++11要求字符串与变量连接需加空格。解决方法包括在Makefile中设置为C++98标准或使用控制宏避免该问题。重新编译后,虽有警告但能成功编译。

1. 在X86架构的CPU上编译是ok的,没有警告,没有报错;然后移植到ARM64架构上编译时候,就报错了。
在这里插入图片描述

2. C++11要求,当字符串跟变量连接的时候,必须增加一个空格才行。因此解决方案有2个:
(1) Makefile文件明确告知编译方式采用C++98:
CFLAGS += -std=c++98
(2)采用控制宏方式:

#if __cplusplus < 201103L
    #define STOR_ERROR(fmt, args...)     hlog_format(HLOG_LEVEL_ERROR, "Storage", 
### 关于字符串字面量操作符 `operator""temp` 编译错误的原因分析 在 C++ 中,自 C++11 起引入了用户定义的字面量(User-defined literals),允许开发者通过重载特定的操作符来扩展语言中的字面值语法。然而,在遇到诸如 `error: unable to find string literal operator 'operator""temp'` 这样的编译错误时,通常是因为以下几个原因之一: #### 1. **未正确定义或声明用户定义的字面量** 如果程序试图使用一个名为 `operator""temp` 的用户定义字面量,但该操作符并未被正确实现,则会触发此错误。根据标准规定,用户定义的字面量需要满足一定的签名格式[^3]。 例如,对于字符串字面量,其基本形式如下: ```cpp OutputType operator "" temp(const char* str, size_t len); ``` 其中: - 参数 `str` 是指向原始字符串的指针; - 参数 `len` 表示字符串的实际长度(不包括终止符 `\0`)。 因此,若要修复此类问题,需确保已提供上述签名的函数定义。 --- #### 2. **拼写错误或命名冲突** 另一个常见原因是名称拼写错误或者与其他现有实体发生冲突。比如可能误写了前缀 `_temp` 或者遗漏了必要的双引号 `" "` 符号。这可能导致编译器无法识别目标操作符的存在。 --- #### 3. **编译选项缺失支持 C++11 及以上版本的功能** 某些旧版工具链默认情况下并不启用新特性如 UDL (User Defined Literals),所以即使代码逻辑无误也可能报错。此时应确认项目构建配置文件里包含了 `-std=c++11` 或更高版本标志位设置[^4]。 --- 以下是修正后的示范代码片段供参考: ```cpp #include <iostream> using namespace std; // 定义一个新的用户定义字面量 suffix "temp" constexpr long double operator "" temp(unsigned long long value){ return static_cast<long double>(value * 1e-9); // 假设这里我们想创建纳秒单位的时间间隔表示法 } int main(){ auto time_in_seconds = 500000000_temp; cout << "Time in seconds: " << time_in_seconds << endl; } ``` --- ### 总结建议 针对当前所描述的情况,请逐一排查是否存在上述提到的各种可能性,并依据实际情况调整源码直至消除所有相关联警告信息为止。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

内核之道

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值