C:错误:“SRT_ControleComplet_S”之前的预期表达式
Posted
技术标签:
【中文标题】C:错误:“SRT_ControleComplet_S”之前的预期表达式【英文标题】:C : error: expected expression before âSRT_ControleComplet_Sâ 【发布时间】:2014-04-17 10:13:16 【问题描述】:我正在尝试开发一个 C 应用程序,使用一些我无法修改的库和函数(它们是由其他人提供的)。
这是我出现问题的代码块:
unsigned short errSV;
unsigned short sgdSessFSE;
errSV = SRT_ControleComplet_S(sgdSessFSE);
下面是 SRT_ControleComplet_S 在头文件中的声明方式:
typedef unsigned short (API_ENTRY FARPTR SRT_ControleComplet_S) (unsigned short NumeroSession);
API_ENTRY 和 FARPTR 定义为
#ifndef API_ENTRY
#define API_ENTRY
#endif
#ifndef FARPTR
#define FARPTR *
#endif
编译时出现如下错误:
错误:SRT_ControleComplet_S 之前的预期表达式
我已经遇到了 ]、 和其他特殊字符放在错误位置的问题,但在这里我真的不知道如何解决。
有人知道我该怎么办吗?
===============更新
嗯,这个问题几乎自己解决了……显然我得到的标题不是最后一个版本,所以有人给了我。
这是最后一个版本:
typedef unsigned short (API_ENTRY TFCTSRTCONTROLECOMPLET_S)
(unsigned short NumeroSession);
extern TFCTSRTCONTROLECOMPLET_S SRT_ControleComplet_S;
现在好多了,用 extern。
感谢您对我的帮助和您的建议!
【问题讨论】:
API_ENTRY
和FARPTR
的值是多少?
API_ENTRY
显然是一个简单的定义,FARPTR
等于 * 在标头中:#ifndef API_ENTRY #define API_ENTRY #endif #ifndef FARPTR #define FARPTR * #endif
【参考方案1】:
这不是一个可以调用的函数,它是一个类型(在 typedef 中指定)。 例如:
typedef int (*foo) (int bar);
int func1 (int bar)
return bar + bar;
int func2 (int bar)
return bar * bar;
int main (void)
foo f_ptr; // declare a variable
f_ptr = func1; // set variable to func1
f_ptr (10); // returns 20
f_ptr = func2; // set variable to func2
f_ptr (10); // results in 100
正如你在上面看到的,“foo”不是一个函数,而是一个函数的类型名。所有大写的其他内容在某处是#defined,由于我不知道预处理器对它做了什么,我无法评论它,只能说它必须至少产生一个星号。
【讨论】:
你是对的,FARPTR 等于 *,API_ENTRY 只是一个简单的定义。我将它们添加到我原来的帖子中。 我上面的评论没有显示如何修复错误吗? 好吧,我按照你说的尝试了,通过这样做SRT_ControleComplet_S errSV; unsigned short ret; unsigned short sgdSessFSE; errSV = SRT_ControleComplet_S; ret = errSV(sgdSessFSE);
,但我仍然有同样的错误。我想我按照你说的做了,不是吗?
SRT_ControleComplet_S 是一种类型,如 int 或 float。所以你需要声明一个 SRT_ControleComplet_S 类型的变量,然后将该变量作为函数调用:SRT_ControleComplet_S fptr = someFunc; fptr();你必须找到一个合适的(或写一个合适的)'someFunc'。【参考方案2】:
所以@Lelanthran 的意思是改变你的代码:
unsigned short errSV;
unsigned short sgdSessFSE;
SRT_ControleComplet_S fn /* = something */ ;
errSV = fn(sgdSessFSE);
至少应该可以编译。
由于SRT_ControleComplet_S
是一个类型,编译器没有关于要调用的函数的信息,只有参数和返回类型,所以你需要初始化你的fn
变量指向要调用的函数。因此,您应该会发现您的库提供了一个或多个 API 入口点函数,这些函数具有相同的参数和返回类型,这就是您在我放置 /* = something */
的位置放置的内容。
如果您需要更具体的帮助,您需要告诉我们更多有关该库的信息,或者上传标题。
【讨论】:
以上是关于C:错误:“SRT_ControleComplet_S”之前的预期表达式的主要内容,如果未能解决你的问题,请参考以下文章
vuejs - 来自 chokidar (C:\) 的错误:错误:EBUSY:资源繁忙或锁定,lstat 'C:\hiberfil.sys'