gcc -Wall 引入编译器错误
gcc -Wall introduces compiler error
我正在尝试在 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是典型的"C static assert":
#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'
它不同于类似于“错误:数组大小 'umba_static_assertion_at_line_21' 为负数”的静态断言错误。
而且,据我所知,项目中的任何地方都没有调用 round 函数。
以下是所有编译器选项,以防万一; IDE:
自动将包含到 Keil 文件夹的内容放在那里
-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
我不知道该怎么办。
检查从命令行调用编译器时错误是否仍然存在。某些 IDE 可能会正确解析编译器的输出并错误地发出错误警告。
错误的原因很简单:
./src/Global_Macros/global_macros.h(99): warning: typedef
'umba_static_assertion_at_line_131' locally defined but not used
[-Wunused-local-typedefs]
您的经典 C 风格静态断言宏通过创建一个 typedef 来工作,如果断言失败,它将是错误定义的,或者如果断言通过则只是未使用。但是 -Wall 包括 -Wunused-local-typedefs,如果您创建了 typedef 但不使用它,它会生成警告。我怀疑您还打开了将警告视为错误的选项。
我正在尝试在 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是典型的"C static assert":
#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'
它不同于类似于“错误:数组大小 'umba_static_assertion_at_line_21' 为负数”的静态断言错误。 而且,据我所知,项目中的任何地方都没有调用 round 函数。
以下是所有编译器选项,以防万一; IDE:
自动将包含到 Keil 文件夹的内容放在那里-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
我不知道该怎么办。
检查从命令行调用编译器时错误是否仍然存在。某些 IDE 可能会正确解析编译器的输出并错误地发出错误警告。
错误的原因很简单:
./src/Global_Macros/global_macros.h(99): warning: typedef 'umba_static_assertion_at_line_131' locally defined but not used [-Wunused-local-typedefs]
您的经典 C 风格静态断言宏通过创建一个 typedef 来工作,如果断言失败,它将是错误定义的,或者如果断言通过则只是未使用。但是 -Wall 包括 -Wunused-local-typedefs,如果您创建了 typedef 但不使用它,它会生成警告。我怀疑您还打开了将警告视为错误的选项。