请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:CODECOMPOSER 主题中讨论的其他器件:AWR1843AOP、AWR1843
大家好。
为了减少开发人员的错误、我积极使用 C++的 constexpr 和 template 函数进行代码管理和编译时常量计算。
现在已确认四款汽车型号实现大规模生产(超过100万个 AWR1843AOP 器件)、防止开发人员犯错非常重要。
我还尝试了 MSVC 和 ARM GCC、启用了 C++14选项、但编译成功了。
请参阅此编译器资源管理器链接: 编译器资源管理器( godbolt.org )
CCS 开发环境使用 TI v20.2.7.LTS 作为 AWR1843 MSS 内核(ARM coretex R4F)目标。
编译时导致错误的代码如下所示:
请参阅 ENABLE_TI_Compiler_error 和 ENABLE_TI_Compiler_stack_overflow_error 宏以开启/关闭它们。
代码 |
#包含 <stdio.h>
#包含 <type_traits>
#包含 <array>
#包含 <cmath>
#包含 <stddef.h>
#define ENABLE_TI_Compiler_error 1
#define ENABLE_TI_Compiler_stack_overflow_error 0 //警告:请在尝试之前保存所有正在处理的文件。
模板 <typename T>
struct is_std_array : std ::false_type {};
Template <typename V、 size_t N>
struct is_std_array> <std::array<V, N> : std ::true_type {};
Template <typename V、 size_t N>
struct is_std_array<const std <V, N> :: array_type {};
模板<typename T>
constexpr bool is_std_array_v = is_std_array:value; <T>
#if enable_TI_Compiler_error
/**
*@简述 TI v20.2.7.LTS 编译器错误
*:错误#28:表达式必须有一个常量值
* template constexpr bool 不能正常工作
*/
#define STD_ARR_CHK (_TYPE_) is_std_array_v<_TYPE_>
#else
#define STD_ARR_CHK (_TYPE_) IS_STD_ARRAY<_TYPE_> :value
#endif
模板<typename Ty>
inline constexpr Ty get_gt(Ty a, Ty b) {
返回 a > b ? a : b;
}
Template<类型名称 Ty、 size_t N>
constexpr std ::enable_if_t (Ty) && std:is_aritudo <Ty>::value、
std::DECAY_tMax><Ty> getArrMax (const std ::<Ty, N> array&arr) {
自动 最大值 = arr[0];
对于 (size_t i = 1; I < N; I++)
最大值 = get_gt (arr[i]、 max);
返回 最大值;
}
Template<typename Ty、 size_t N、 typename std::enable_if_t <STD_ARR_CHK(Ty)>* = nullptr>
constexpr auto getArrMax(const std : arra:strocal& arr)<Ty, N> {
Auto max = getArrMax (arr[0]);
对于 (size_t i = 1; I < N; I++)
Max = get_gt (getArrMax (arr[i])、 max);
返回 最大值;
}
static constexpr std :: array<const std : arra:const,<float, 3> 2> testStdArr = {
std:arraCb <float, 3> {0.f、 1.f、2.f }、
std:arraCc <float, 3> {3.f、 4.f、-5.f }
};
static constexpr float testCstyleArr[2][3] = {
{0.f、1.f 、2.f }、
{3.f、4.f 、-5.f }
};
模板<typename Ty>
结构 符号 {
公共:
typedef Arr _self;
typedef Ty 值类型;
typedef 值类型和 参考;
typedef const value_type_const_reference ;
typedef 值类型* 迭代器;
typedef const value_type* const_iterator;
typedef 值类型* 指针;
typedef const value_type* const_pointer;
typedef size_t size_type;
typedef ptrdiff_t 差异类型;
explicit constexpr arr()
: p_(Nullptr ), SZ_(0U) {};
模板<size_t N>
显式 constexpr Arr (const value_type (&addr)[N])
: p_(const_cludr),SZ_(N){}<pointer>
模板<size_t N>
显式 constexpr arr (std :: arrastroci <value_type, N> && arr)
: p_(N? const_4512V(&(arr[0]<pointer>) : nullptr )
、 SZ_(N) {}
模板<size_t N>
显式 constexpr arr (const std :: arrastroci <value_type, N> 和 arr)
: p_(N? const_4512V(&(arr[0]<pointer>) : nullptr )
、 SZ_(N) {}
inline constexpr const_reference 运算符[](size_type n) const { return p_[n];}
inline constexpr 引用 运算符[](size_type n) { return p_[n];}
inline constexpr iterator begin() noexcept{ return p_; }
inline constexpr iterator end() noexcept { return p_+SZ_; }
inline constexpr const_iterator begine() 常量 no,但 { return p_; }
inline constexpr const_iterator end() 常量 no,但 { return p_ + SZ_; }
inline constexpr const_iterator cbegine() 常量 no,但 { return p_; }
inline constexpr const_iterator cend() 常量 节点,但 { return p_+SZ_; }
inline constexpr size_type size() const noexcept{ return SZ_; }
inline constexpr 指针 data() noexcept{ return p_; }
inline constexpr const_pointer data() 常量 no,但 { return p_; }
inline constexpr 运算符 pointer() noexcept{ return p_; }
inline constexpr 运算符 const_pointer() 常量 no,但 { return p_; }
私有:
指针 const p_;
const size_type SZ_;
};
int main() {
static_assert (__cplusplus >= 201402L、 "__cplusplus 版本需要 c++14");
#ifdef _LIBCPP_STD_VER
STATIC_ASSERT (_LIBCPP_STD_VER >= 14、 "_LIBCPP_STD_VER 错误");
#endif
静态 constexpr auto arraMax = getArrMax (testStdArr);
static_assert (arrMax == 4.f、 "getArrMax error");
Static constexpr const Arr <float> cArrOk(testCstyleArr[0]);
static_assert (cArrOk.size () =3 、 "Arr size error");
#if enable_TI_Compiler_error && enable_TI_Compiler_stack_overflow_error
/**
*@简述 TI v20.2.7.LTS 编译器错误
* :致命错误#4:内存不足
* 数组下标编译错误(?)
* 警告:请在尝试之前保存您正在处理的所有文件。
*/
static_assert ((cArrOk[0] < cArrOk[1] ) && (cArrOk[1] < cArrOk[2] ), "Arr elem Compare Fail (1)");
#endif
#if enable_TI_Compiler_error && enable_TI_Compiler_stack_overflow_error
/**
*@简述 TI v20.2.7.LTS 编译器错误
* :致命错误#4:内存不足
*构造函数编译错误(?)
*警告:请在尝试之前保存您正在处理的所有文件。
*/
static constexpr const arr <float> stdArrFail (testStdArr[0]);
static_assert (cArrOk[1] == stdArrFail [1]、 "Arr elem 比较失败(2)");
#endif
#if enable_TI_Compiler_error && enable_TI_Compiler_stack_overflow_error
/**
*@简述 TI v20.2.7.LTS 编译器错误
* :致命错误#4:内存不足
双精度数组下标编译错误(?)
* 警告:请在尝试之前保存您正在处理的所有文件。
*/
static_assert (testStdArr[0][1] == 1.f、 "");
#endif
返回 0;
}
|
在其他编译器中验证的函数会导致 TI 编译器中出现许多错误。
如以上代码所述、
还有一个荒谬的问题,在 constexpr 不支持逻辑非运算符。
如果我知道这些问题、我就不会使用 C++了。
我们需要通过一种方法来将 CCS 中的 TI 编译器替换为 linaro ARM GCC。
感谢您的支持。