文章目录
- call to non-'constexpr' function
- 概述
- 备注
- END
call to non-‘constexpr’ function
概述
在尝试迁移 openpnp - Smoothieware project 从gcc命令行 + MRI调试方式 到NXP MCUXpresso工程.
在加了头文件路径后, 还有一些语法错误. 这和编译器语法有关系.
在运行BuildShell.cmd后, 查看gcc版本如下.
D:\3rd_prj\Smoothieware_best-for-pnp>gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=c:/mingw/bin/../libexec/gcc/mingw32/9.2.0/lto-wrapper.exe
Target: mingw32
Configured with: ../src/gcc-9.2.0/configure --build=x86_64-pc-linux-gnu --host=mingw32 --target=mingw32 --disable-win32-registry --with-arch=i586 --with-tune=generic --enable-static --enable-shared --enable-threads --enable-languages=c,c++,objc,obj-c++,fortran,ada --with-dwarf2 --disable-sjlj-exceptions --enable-version-specific-runtime-libs --enable-libgomp --disable-libvtv --with-libiconv-prefix=/mingw --with-libintl-prefix=/mingw --enable-libstdcxx-debug --disable-build-format-warnings --prefix=/mingw --with-gmp=/mingw --with-mpfr=/mingw --with-mpc=/mingw --with-isl=/mingw --enable-nls --with-pkgversion='MinGW.org GCC Build-2'
Thread model: win32
gcc version 9.2.0 (MinGW.org GCC Build-2)
Smoothieware使用c++写的.
其中一条错误如下:
描述 资源 路径 位置 类型
call to non-'constexpr' function 'uint16_t get_checksum(const char*)' checksumm.h /my_Smoothieware_best-for-pnp/src/libs 第 162 行 C/C++ Problem
查了一下这条错误的原因, 就是语法错误.
在switch的case处, 用了常量表达式函数(一个函数来代替常量, 这个函数在编译期就能确定值), 那么这个常量表达式就必须标记为constexpr
使用constexpr比宏更好, 更明确.
做了一个实验, 可以正常使用constexpr了.
// ConsoleApplication2.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
// constexpr 是c++11的语法, vs2022默认的最低编译器是c++14, 符合要求.
// constexpr好处是不用再写宏. 而是由编译器在编译时, 就能确定一个常量表达式的值. 这个常量表达式是有值类型的, 比宏好.
// 如果函数需要作为常量表达式, 必须标记为 constexpr
constexpr int test(int x, int y)
{
return (x + y);
}
int inum_ary[test(1,2)];
class cls_adc {
public:
cls_adc()
{
}
virtual ~cls_adc()
{
}
int get_x()
{
return inum_ary[2];
}
static const int i_ary_cnt = test(1, 2); // 如果constexpr函数的值要间接作为一个常量用, 这个常量必须为 static const type
int inum_ary[i_ary_cnt];
};
int main()
{
std::cout << "Hello World!\n";
int i = 0;
cls_adc case1;
printf("get_x() = %d\n", case1.get_x());
for (i = 0; i < case1.get_x(); i++)
{
switch (i)
{
// 作为case使用时的常量表达式函数, 必须标记为 constexpr
case test(0, 1):
printf("bp1\n");
break;
default:
break;
}
}
system("pause");
}
备注
在具体工程中的错误, 在具体去改.
不清楚为啥同样的代码, 在gcc命令行 + makefile下就能编译过. 也许是编译器命令行不同. 以后有兴趣再查.
现在先尝试将代码中的语法限定先改了, 能在MCUXpresso工程中编译过再说.