【问题标题】:Variadic Function Pointer definition is unclear for VxWorks spyLibVxWorks spyLib 的可变函数指针定义不清楚
【发布时间】:2020-06-15 21:15:25
【问题描述】:

我正在使用 VxWorks 6.9 并尝试使用一些 spyLib.h 函数,但鉴于类型是可变的,我在寻找期望的签名时遇到问题。

vxTypesOld.h我找到我的类型:typedef int (*FUNCPTR) (...);

spyLib.h 我有我的函数调用:extern void spyReportCommon (FUNCPTR printRtn);

但是 printRtn 需要哪些函数参数?我猜c风格的字符串是一个,但我不知道表格的每一行是一个字符串还是一个字符串数组,甚至是一个大字符串。

在我知道数据以何种形式传递到函数之前,我无法开始编写函数来解析输出数据中的数据。

我只知道它返回一个 int(例如int parsePrint( ???? );

这是我的报告尝试:

#include <vxworks.h>
#include <spyLib.h>
#include <usrLib.h>

int ParseSpy(const char * spyOutput); // this is a guess

void Startup()
{
    //startup logic

    // the compiler said and int param is expected but the .h had void
    spyLibInit(1); 

    spyCommon(1,50, (FUNCPTR) &ParseSpy);
}

int ParseSpy(const char * spyOutput){} // this is a guess

我收到一个意外的编译器错误:“spyCommon”未在范围内声明 但正如你所看到的,spyLib.h 被包含在内,所以我对此有点困惑。

【问题讨论】:

  • 文档是怎么说的?
  • @AsteroidsWithWings 除了从自动输出到标准输出的终端调用 spy 之外,我在文档中没有发现任何相关内容
  • 为什么你认为你需要有某些参数而不是...?从int(...) 转换为其他任何东西甚至都不合法(反之亦然)
  • "spyCommon not declared" 是编译错误。此外,“编译器说 int param 是预期的,但 .h 有 void”看起来非常可疑。当编译器明确表示它需要 int 时,您究竟是如何发现它 void 的? C++ 没有魔法。如果它被声明为 spyCommon ,则不能出现“未声明”错误。如果 spyLibInit 它被声明为 void ,编译器就不会期望 int 在那里。因此,在尝试弄清楚如何首先编写可变参数之前,您必须先解决编译器错误,因此可变参数函数指针将是您唯一剩下的问题。
  • 你会从usrLib.c中的spy()函数中找到线索。

标签: c++ c++98 vxworks


【解决方案1】:

这看起来是个糟糕的设计。如果打印函数不知道参数是什么,它就无法打印。至少需要一个参数来指定其余参数是什么。

查看source 并搜索“printRtn”,我发现所有对打印函数的调用都需要printf 类似函数,其中第一个参数是格式字符串。你的函数最好写成

int ParseSpy(const char * spyOutput, ...);

关于缺少的spyCommon,您可以尝试让 VxWorks 将预处理器输出写入文件以检查编译器看到的内容。也许你得到了错误的 spylib.h 文件或者该文件被 #if 隐藏的东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多