jerry尧 发表于 2025-10-27 15:10

STM32CubeIDE 中用空的 C++ 项目无法重载

我在 STM32CubeIDE 中用空的 C++ 项目无法重载一个简单的函数。又遇到了奇怪的问题。
新建了一个空的 STM32 项目并选择了 C++。现在我写了两个函数,
void test(uint8_t a)
{

}
void test(uint16_t a)
{

}

但却收到了 “重定义函数 test” 的错误。该文件和所有源文件一样后缀是.c,而如果我把它改成.cpp,就能正常工作。但要是我把其他源文件改成.cpp,那些文件中的函数就找不到了。如果保持.c 后缀,就无法进行函数重载。这到底是怎么回事啊???

公羊子丹 发表于 2025-10-28 07:43

我遇到过一模一样的情况,后来发现只要主文件是.c,整个编译器都会用C模式编译,不认C++的特性。你可以试着把main也改成.cpp再编译试试。

周半梅 发表于 2025-10-28 07:44

我遇到过一模一样的情况,后来发现只要主文件是.c,整个编译器都会用C模式编译,不认C++的特性。你可以试着把main也改成.cpp再编译试试。

帛灿灿 发表于 2025-10-28 07:46

CubeIDE挺“狡猾”的,默认C和C++文件是分开编译链的,混着用就容易出这种问题。建议要么全用.c,要么全用.cpp,别混。

童雨竹 发表于 2025-10-28 07:47

其实你可以把想写C++的文件单独放成.cpp,然后在C文件里加上extern "C"去声明接口,这样两边能兼容,不会找不到函数。

万图 发表于 2025-10-28 07:48

我怀疑是编译器选项没启用C++支持,去Project -> Properties -> C/C++ Build -> Settings里看看是不是用的gcc而不是g++。

Wordsworth 发表于 2025-10-28 07:49

这个坑我踩过,STM32CubeIDE虽然支持C++,但自动生成的startup文件、main.c默认都是C语言的,得手动改main.cpp并改入口函数。

Bblythe 发表于 2025-10-28 07:51

调侃一句,CubeIDE的C++支持就像“半成品”,不如自己建纯C++工程然后移植CubeMX生成的驱动文件干净省心。

Pulitzer 发表于 2025-10-28 07:52

调侃一句,CubeIDE的C++支持就像“半成品”,不如自己建纯C++工程然后移植CubeMX生成的驱动文件干净省心。

Uriah 发表于 2025-10-28 07:54

你要注意.c文件里定义的函数默认是C linkage,改成.cpp后编译器会用C++ linkage,符号不一样,链接阶段自然报“找不到函数”。

Clyde011 发表于 2025-10-28 07:55

其实重载是编译期语法检查的问题,不是链接问题,所以只要文件是C语言模式就不支持。改成.cpp是唯一解,或者用不同函数名。

公羊子丹 发表于 2025-10-28 07:56

我建议你可以在同个工程里分两类文件:底层驱动保留C文件,上层逻辑改用C++,通过extern "C"接口隔离,既能重载又能兼容。

wanduzi 发表于 2025-10-28 09:27

建议要么全用.c,要么全用.cpp,
页: [1]
查看完整版本: STM32CubeIDE 中用空的 C++ 项目无法重载