我试图在Keil IDE中为stm32f103微控制器使用gcc编译器。我用一些模板代码和几个纯虚拟类编译了一个相对较小的项目。没有花哨的C ++ 11东西。 到目前为止一切都很好。
当我使用-w或-pedantic编译时,项目编译就好了。 但是当我把-Wall放在这部分时出现编译错误时:
template <typename T, typename U>
T & round(T & value, U roundStep)
{
UMBA_ASSERT(roundStep > 0);
UMBA_STATIC_ASSERT( std::numeric_limits<T>::is_integer );
UMBA_STATIC_ASSERT( std::numeric_limits<U>::is_integer );
T temp = value / roundStep;
T remainder = value - temp*roundStep;
if(remainder < roundStep/2)
{
value = temp*roundStep;
}
else
{
value = (temp+1)*roundStep;
}
return value;
}
UMBA_STATIC_ASSERT是典型的&#34; C静态断言&#34;:
#define UMBA_STATIC_ASSERT_MSG(condition, msg) typedef char umba_static_assertion_##msg[(condition)?1:-1]
#define UMBA_STATIC_ASSERT3(X, L) UMBA_STATIC_ASSERT_MSG(X, at_line_##L)
#define UMBA_STATIC_ASSERT2(X, L) UMBA_STATIC_ASSERT3(X, L)
#define UMBA_STATIC_ASSERT(X) UMBA_STATIC_ASSERT2(X, __LINE__)
有趣的是,我甚至无法理解错误:
compiling common_functions.cpp...
src/Common_Functions/common_functions.h: In function 'T& common_functions::round(T&, U)':
./src/Global_Macros/global_macros.h(99): warning: typedef 'umba_static_assertion_at_line_131' locally defined but not used [-Wunused-local-typedefs]
#define UMBA_STATIC_ASSERT_MSG(condition, msg) typedef char umba_static_assertion_##msg[(condition)?1:-1]
./src/Global_Macros/global_macros.h(100): error: note: in expansion of macro 'UMBA_STATIC_ASSERT_MSG'
./src/Global_Macros/global_macros.h(101): error: note: in expansion of macro 'UMBA_STATIC_ASSERT3'
./src/Global_Macros/global_macros.h(104): error: note: in expansion of macro 'UMBA_STATIC_ASSERT2'
src/Common_Functions/common_functions.h(131): error: note: in expansion of macro 'UMBA_STATIC_ASSERT'
它不同于静态断言错误,它类似于&#39;错误:数组的大小&#39; umba_static_assertion_at_line_21&#39;是消极的&#39;。 而且,据我所知,圆形功能甚至在项目的任何地方都没有调用。
以下是所有编译器选项以防万一;包括Keil文件夹由IDE自动放在那里:
-c -mcpu=cortex-m3 -mthumb -gdwarf-2 -MD -Wall -O0 -I./src -I./src/Modules_Config -I./src/CMSIS -I./src/SPL/inc -ffunction-sections -fdata-sections -fno-exceptions -fno-rtti -mcpu=cortex-m3 -IC:/Keil4.72/ARM/CMSIS/Include -IC:/Keil4.72/ARM/Inc/ST/STM32F10x -DUSE_STDPERIPH_DRIVER -DUSE_FULL_ASSERT -Wa,-alhms="./lst/*.lst" -o *.o
我不知道该如何处理。
答案 0 :(得分:3)
检查从命令行调用编译器时是否仍然存在错误。某些IDE可能会正确解析编译器的输出并错误警告错误。
答案 1 :(得分:0)
错误的原因非常简单:
./ src / Global_Macros / global_macros.h(99):警告:typedef &#39; umba_static_assertion_at_line_131&#39;本地定义但未使用 [-Wunused和本地的typedef]
你的经典C风格静态断言宏的工作原理是使一个typedef在断言失败时定义不明确,或者如果断言通过则只是未使用。但是-Wall包括-Wunused-local-typedef,如果你创建了一个typedef,它会生成一个警告,但是不要使用它。我怀疑你还打开了将警告视为错误的选项。