预期在“ int”之前出现外部“ C”错误“ =”,“,”,“;”,“ asm”或“ __attribute __”

时间:2018-08-31 20:44:00

标签: c++ c extern nrf52

我正在尝试将已编译的库包含在Nordic nrf52840上的C项目中。下面(据我所知)是一种链接到项目其余部分foo文件中的某些方法bar.lib的方法。尝试使用Segger Embedded Studio进行编译时,出现以下代码段,出现以下expected '=', ',', ';', 'asm' or '__attribute__' before 'int'错误:

#ifndef _FOOBAR_SERVICE_H_
#define _FOOBAR_SERVICE_H_

#if (defined(__linux__) || defined(__APPLE__) || defined(ARDUINO) || 
defined(__MSP430FR5969__))
#define IMPORT __attribute__ ((visibility ("default")))
#define EXPORT __attribute__ ((visibility ("default")))
#define LOCAL  __attribute__ ((visibility ("hidden")))
#elif defined(_WIN32)
#define EXPORT __declspec(dllexport)
#endif

#include <stdbool.h>

#ifdef __cplusplus

extern "C"
{
#endif

EXPORT int ble_foo(unsigned char  *a, unsigned char *buffer);  //<--(error)

EXPORT int ble_bar(unsigned char  *b, unsigned char *buffer);  //<--(same error)

#ifdef __cplusplus
}
#endif
#endif /* _FOOBAR_SERVICE_H_ */

以上是我的#include "foobar_ble.h"文件中包含的main.c

部分原因可能是我对extern "C"的误解,我认为这是编译C代码的一种方式。我相信#ifdef __cplusplus正在检查是否可以编译为c ++,这是否意味着extern "C"甚至没有在C环境中使用?

此外,我似乎无法在C中找到关于EXPORT关键字的很好的解释。这也可能是我遇到问题的根源。

Tl; dr:太笨了,有太多问题需要帮助。谢谢,谢谢。

1 个答案:

答案 0 :(得分:3)

我认为问题在于您的情况下rate没有定义任何东西。因此,它将仅保留在源代码中并导致语法错误。可能打算将其定义为静态库上的诸如__declspec(dllexport)之类的内容,而对于静态使用则不进行任何定义(空字符串)。

您应该可以通过将EXPORT定义为一个空字符串来解决此问题。根据库的不同,在某些配置头文件中可能会存在一个位置。否则,您也可以在编译器调用级别上使用定义,但这可能不是可取的,因为它会从源代码中删除所有EXPORT个单词。