【问题标题】:Passing by variable through an external library通过外部库传递变量
【发布时间】:2011-05-24 15:37:14
【问题描述】:

如何在 C 库提供的接口函数上执行变量传递?

例如我有如下接口函数:
void f( double *d ) { *d = 7.5; }

在我的应用程序中,我通过该库链接并调用该函数:
double p = 0;
f( &p );

但是,我注意到 p 仍然是 0 而不是 7.5。

【问题讨论】:

    标签: c pointers parameter-passing


    【解决方案1】:

    您的应用程序中是否有f 的原型?

    如果没有,编译器会将p 的地址转换为int;如果它们的大小不同或使用相同的传递约定或其他什么,你就会遇到问题。

    您应该#include "the_proper_header.h" 或者您可以直接在您的应用程序中添加原型,就在您调用函数之前。

    double p = 0;
    void f(double *);
    f( &p );
    

    【讨论】:

    • 是的,头文件已经包含了。如果函数不在程序中而是在另一个库中,是否有任何特殊处理?没有链接错误。
    • 不,没有特殊处理。许多函数(printfmallocsqrt、...、...)并未在使用它们的程序中定义。您真的在使用普通的旧 C 吗?您对“界面”的使用很奇怪(ish)
    • 我也是这么想的。是的,普通的 C,有什么奇怪的?
    • 感谢您的确认,反正我发现了这个问题,和上面没有关系。
    • 重新接口陌生(可能是我对英语的误用):对我来说,“接口”适用于库(或模块)而不是特定功能。我可能会从您的问题中省略第一个“接口”,并将“接口函数”中的第二个替换为“函数定义”。
    【解决方案2】:

    您的示例有效,请参阅http://codepad.org/JJL7eab5

    我所做的唯一更改是在定义 f() 之前声明它:

    void f(double *);
    

    如果函数定义被声明为静态,它也可以工作。在 C 中,函数需要在定义之前声明或声明为静态。

    【讨论】:

    • 是的,如果只是在普通程序中,它就可以工作。但是当我尝试将 f() 放入库中时,我注意到即使我在库中对其进行了更改,它也只会按值传递参数。
    猜你喜欢
    • 2023-03-11
    • 2012-07-16
    • 2021-08-26
    • 1970-01-01
    • 1970-01-01
    • 2018-10-11
    • 2011-10-19
    • 2014-12-25
    • 2015-06-23
    相关资源
    最近更新 更多