函数指针声明编译错误

Posted

技术标签:

【中文标题】函数指针声明编译错误【英文标题】:compile error with function pointer declaration 【发布时间】:2014-08-09 12:30:31 【问题描述】:

我正在尝试将 openssl 导入我的 swift 项目,但是当我在 xxx-Bridging-Header.h 中添加 #import "ras.h" 时,出现以下编译错误。

<unknown>:0: error: /Users/wenyun/workspace/newsvn/newios/ios/VanJoyPay2/VanJoyPay2/opensource/OpenSSLRSAWrapper/openssl/include/openssl/rsa.h:100: expected ')'
<unknown>:0: note: /Users/wenyun/workspace/newsvn/newios/ios/VanJoyPay2/VanJoyPay2/opensource/OpenSSLRSAWrapper/o penssl/include/openssl/rsa.h:100: to match this '('

ras.h:100 是:

int (*rsa_mod_exp)(BIGNUM *r0,const BIGNUM *I,RSA *rsa,BN_CTX *ctx); /* Can be null */

我通过将const BIGNUM *I 重命名为const BIGNUM *i 来修复错误。有谁知道I这个角色为什么这么特别?

我今天又做了一个测试,结果看起来很奇怪。 我新建了一个swift项目,写了3个头文件:

test.h
int test(char *I);

test2.h
#import "test3.h"
#import <Foundation/Foundation.h>

test3.h
int test3();


xxx-Bridging-Header.h
#import "test2.h"
#import "test.h"

我又遇到了编译错误!

最后,删除“#import”让一切正常。

Why the character "I" could not work together with #import &lt;xxx&gt;?

【问题讨论】:

这看起来很奇怪(注意 OpenSSL 字母之间的额外空格):.../OpenSSLRSAWrapper/o penssl/include/.... 这看起来像是某处的某人#define I,您可以检查预处理器的结果以了解发生了什么 我们可以使用#undef I来删除定义。 我想得到I和复杂的函数,你是怎么导入的?? 【参考方案1】:

问题与 Swift 无关。这是由/usr/include/complex.h 文件中I 的先前定义引起的(正如Brian Chen 猜测的那样)。

以下是编译器报告的违规行:

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator8.1.sdk/usr/include/complex.h:42:11: note: expanded from macro 'I'
#define I _Complex_I

【讨论】:

我在一个 swift 项目中使用 openSSL 来验证应用内购买收据时遇到了同样的问题。我需要包含导致上述错误的 x509.h。我对整个 iOS 开发有点陌生,我不确定解决这个问题的正确方法是什么?在 rsa.h 中将 i 重命名为 i 可以吗? 是的,这应该足以解决构建问题。

以上是关于函数指针声明编译错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 typedef、多维数组和指针时出现编译器错误

gcc 编译错误,对象初始化解释为函数指针?

C/C++编程笔记:那些不会在C ++中编译的C程序,挺特殊奥~

在另一个函数中前向声明“constexpr”函数——编译器错误?

紧急求助!ARM-GCC对于函数指针调用的编译有错误?已经找到原因

Linux 上 Poco::Logger 的编译器错误 - 函数声明被视为宏