STM32CubeIDE 中用空的 C++ 项目无法重载
我在 STM32CubeIDE 中用空的 C++ 项目无法重载一个简单的函数。又遇到了奇怪的问题。新建了一个空的 STM32 项目并选择了 C++。现在我写了两个函数,
void test(uint8_t a)
{
}
void test(uint16_t a)
{
}
但却收到了 “重定义函数 test” 的错误。该文件和所有源文件一样后缀是.c,而如果我把它改成.cpp,就能正常工作。但要是我把其他源文件改成.cpp,那些文件中的函数就找不到了。如果保持.c 后缀,就无法进行函数重载。这到底是怎么回事啊???
我遇到过一模一样的情况,后来发现只要主文件是.c,整个编译器都会用C模式编译,不认C++的特性。你可以试着把main也改成.cpp再编译试试。 我遇到过一模一样的情况,后来发现只要主文件是.c,整个编译器都会用C模式编译,不认C++的特性。你可以试着把main也改成.cpp再编译试试。 CubeIDE挺“狡猾”的,默认C和C++文件是分开编译链的,混着用就容易出这种问题。建议要么全用.c,要么全用.cpp,别混。 其实你可以把想写C++的文件单独放成.cpp,然后在C文件里加上extern "C"去声明接口,这样两边能兼容,不会找不到函数。 我怀疑是编译器选项没启用C++支持,去Project -> Properties -> C/C++ Build -> Settings里看看是不是用的gcc而不是g++。 这个坑我踩过,STM32CubeIDE虽然支持C++,但自动生成的startup文件、main.c默认都是C语言的,得手动改main.cpp并改入口函数。 调侃一句,CubeIDE的C++支持就像“半成品”,不如自己建纯C++工程然后移植CubeMX生成的驱动文件干净省心。 调侃一句,CubeIDE的C++支持就像“半成品”,不如自己建纯C++工程然后移植CubeMX生成的驱动文件干净省心。 你要注意.c文件里定义的函数默认是C linkage,改成.cpp后编译器会用C++ linkage,符号不一样,链接阶段自然报“找不到函数”。 其实重载是编译期语法检查的问题,不是链接问题,所以只要文件是C语言模式就不支持。改成.cpp是唯一解,或者用不同函数名。 我建议你可以在同个工程里分两类文件:底层驱动保留C文件,上层逻辑改用C++,通过extern "C"接口隔离,既能重载又能兼容。 建议要么全用.c,要么全用.cpp,
页:
[1]