We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
Hi all,I have a project with C and C++, I'm compiling it with armcc v5.06 (Keil uVision 5):
--c99 -c --cpu Cortex-M4.fp -g -O3 --apcs=interwork --split_sections -I../Core/Inc -I../Drivers/STM32F4xx_HAL_Driver/Inc -I../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I../FreeRTOS/Source/include - ...[removed includes for cleanliness]-D__UVISION_VERSION="517" -D_RTE_ -DSTM32F469xx -DUSE_HAL_DRIVER -DMY_MODULE_ID="3" -DDUO8 -DTOUCH_GFX -DSTM32F469xx -o "..\..\..\Projects\MDK-ARM\Framework\*.o" --depend "..\..\..\Projects\MDK-ARM\Framework\*.d"As I checked here: ARM Compiler toolchain Compiler Reference Version 5.03,
--c99
This option enables the compilation of C99 source code. It enforces C only, and C++ syntax is not accepted.
1) If that's so, How Is my C++ code compiling? As I checked here: ARM Compiler User Guide Version 6.6.1 The default language standard for C++ code is gnu++98. To specify a different source language standard, use the -std=name option.
-std=
2) but based on the table in the link, do I have C++03 standard or something else?---------------------------------------------------------------------------------------------------------------------------Now, for the more interesting part:I have this templated class in DoubleBufferedVideoController.hpp:
template <uint32_t no_streams, uint32_t width, uint32_t height, uint32_t stride, touchgfx::Bitmap::BitmapFormat output_format> class DoubleBufferedVideoController : public touchgfx::VideoController { public: DoubleBufferedVideoController() : VideoController(), bufferRGB(0), sizeBufferRGB(0), topBufferRGB(0), semDecode(0), mutexBuffers(0) { //something } ... }
And this in another .cpp file:#include <DoubleBufferedVideoController.hpp> DoubleBufferedVideoController<1, 320, 800, 320*2U, Bitmap::RGB565> vdt; void videoTaskFunc() { vdt.decoderTaskEntry(); }
#include <DoubleBufferedVideoController.hpp> DoubleBufferedVideoController<1, 320, 800, 320*2U, Bitmap::RGB565> vdt; void videoTaskFunc() { vdt.decoderTaskEntry(); }
As I understand, the template should be instantiated and the constructor called for this global variable, but it isn't. in debug I find that it's NULL, and the constructor never gets used.When I changed it to using a static variable it worked:
#include <DoubleBufferedVideoController.hpp> DoubleBufferedVideoController<1, 320, 800, 320*2U, Bitmap::RGB565>* vdt; VideoController& VideoController::getInstance() { if(!vdt) { static DoubleBufferedVideoController<1, 320, 800, 320*2U, Bitmap::RGB565> vd_350; vdt = &vd_350; } return *vdt; } void videoTaskFunc() { VideoController::getInstance(); vdt->decoderTaskEntry(); }
Can someone please clarify for me what I'm missing as to why the first code doesn't work? I thought it might be a compiler standard issue which is why I added the above questions too.Any help is appreciated!
Arm compiler toolchain v5.x (armcc) has limited support for C++:
https://www.keil.com/support/man/docs/armcc/armcc_chr1407404265784.htm
For better C++ support, please consider using latest Arm compiler toolchain v6.x (armclang):
developer.arm.com/.../Standard-C---library-implementation-definition
Hi ChenTang,I don't see in the link where armcc doesn't support template instantiation, in fact it supposedly should based on:Compiler User Guide: Template instantiation in ARM C++ (keil.com)Could you please clarify which not supported feature is causing my problem?Thanks