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_ENTRYFARPTR的值是多少? 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”之前的预期表达式的主要内容,如果未能解决你的问题,请参考以下文章

段错误的最小 C/C++ 程序? [复制]

vuejs - 来自 chokidar (C:\) 的错误:错误:EBUSY:资源繁忙或锁定,lstat 'C:\hiberfil.sys'

C语言fclose错误

在vs里写c语言,为啥会出现这样的错误呢?

c语言中compiling aaaa.c...是啥错误

c语言编程为啥会出现Undefined symbol 错误