【问题标题】:"error: expected primary-expression before 'volatile'"“错误:'volatile'之前的预期主表达式”
【发布时间】:2016-01-25 15:55:55
【问题描述】:

我正在尝试使用 MinGW 4.8.2 编译 NRF driver。我收到此错误:

中包含的文件中
b:/nrfdriver/sdk/nRF51_SDK_8.1.0_b6ed55f/components/device/nrf51.h:119:0,
                 from b:/nrfdriver/sdk/nRF51_SDK_8.1.0_b6ed55f/components/softdevice/s130/headers/nrf_soc.h:50,
                 from b:/nrfdriver/pc-ble-driver-0.5.0/driver/inc_override/nrf_soc.h:21,
                 from b:/nrfdriver/pc-ble-driver-0.5.0/driver/inc_override/app_util_platform.h:26,
                 from b:/nrfdriver/sdk/nRF51_SDK_8.1.0_b6ed55f/components/drivers_nrf/uart/app_uart.h:27,
                 from b:\nrfdriver\pc-ble-driver-0.5.0\driver\src\app_uart_pc.c:13:
C:/MinGW/mingw64/lib/gcc/x86_64-w64-mingw32/4.8.2/include/xmmintrin.h:
In function 'void _mm_setcsr(unsigned int)':
b:/nrfdriver/sdk/nRF51_SDK_8.1.0_b6ed55f/components/toolchain/gcc/core_cm0.h:164:21:
error: expected primary-expression before 'volatile'    #define   __I 
volatile             /*!< Defines 'read only' permissions   */
                     ^ driver\CMakeFiles\s130_nrf51_ble_driver.dir\build.make:297: recipe for
target 'driver/CMakeFiles/s130_nrf51_ble_driver.dir/src/app_uart_pc.c
.obj' failed

错误来自这一行:

#define   __I     volatile             /*!< Defines 'read only' permissions                 */

这么简单的#define 怎么会导致编译器错误,知道我应该如何解决这个问题吗? (升级编译器不是一个选项,因为这个版本的驱动程序应该是用这个版本的 MinGW 构建的)。

请注意,驱动程序是用 32 位构建的,我正在尝试构建它以 64 位为目标,不知道这是否是问题的原因......

【问题讨论】:

  • 如果将其编译为 32 位而不是 64 位,错误会消失吗?
  • 也许你需要尝试不同的编译器,或者尝试设置 c 版本,我想你应该有 -std=c99
  • 能否在xmmintrin.h上显示相关代码?
  • @NathanOliver:没有测试 32 位......他们为此目标提供了二进制文件,所以我不需要编译它。

标签: c++ windows gcc mingw-w64


【解决方案1】:

如果我们也查看 xmmintrin.h 头文件会怎样?

/* Set the control register to I.  */
extern __inline void __attribute__((__gnu_inline__, __always_inline__, __artificial__))
_mm_setcsr (unsigned int __I)
{
  __builtin_ia32_ldmxcsr (__I);
}

哎呀,__I 的另一种用法。

【讨论】:

  • 该死,我发布问题的速度太快了。我对 MinGW 不熟悉,我几乎可以肯定这是一个编译器问题。显然,它来自代码本身。感谢您的快速回答!
  • 如果有人遇到同样的问题:我手动将驱动程序和 SDK 文件夹中的所有 __I 替换为 __NRF_I:然后编译正常!
猜你喜欢
  • 2023-04-11
  • 2019-09-23
  • 2014-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-13
  • 2017-09-24
相关资源
最近更新 更多