在'int'之前,Extern“C”错误预期为'=',',',';','asm'或'__attribute__'

问题描述 投票:0回答:1

我试图将一个已编译的库包含在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;博士:太笨,问题太多,需要帮助。 Plz和谢谢。

c++ c extern nrf52
1个回答
3
投票

我认为问题是你的情况下EXPORT没有任何定义。所以它只会留在源代码中并导致语法错误。它可能被定义为类似静态库上的__declspec(dllexport),而不是静态用法(空字符串)。

您应该能够通过将EXPORT定义为空字符串来修复它。根据库,某些配置头文件中可能存在该位置。否则,您也可以在编译器调用级别上使用define,但这可能不是更好,因为它会从源代码中删除所有EXPORT单词。

© www.soinside.com 2019 - 2024. All rights reserved.