gcc -Wall引入了编译器错误

时间:2016-05-27 12:14:21

标签: c++ gcc keil

我试图在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

我不知道该如何处理。

2 个答案:

答案 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,它会生成一个警告,但是不要使用它。我怀疑你还打开了将警告视为错误的选项。