This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CODECOMPOSER:在编写 c++14代码时、ARM 编译器中会出现故障

Guru**** 664280 points
Other Parts Discussed in Thread: AWR1843, AWR1843AOP
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/1270229/codecomposer-bug-occurs-in-the-arm-compiler-when-writing-at-c-14-code

器件型号: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。

感谢您的支持。