当前位置:  技术问答>linux和unix

问一个关于引用外部函数的问题.用了三种方法,其中是不是有多余的?50分求助

    来源: 互联网  发布时间:2016-01-29

    本文导语:  A.h/c B.h/c。现在A要引用B的一个函数X。我现在为此做了3件事: 1.将X在B.h中声明,然后在A.h中include B.h 2.在A.h中直接写上 extern X 3.在Makefile中,A.o:B.o(即形成A.o需要B.o) 现在想问是否这三件事都需要做,还是有些重复...

A.h/c B.h/c。现在A要引用B的一个函数X。我现在为此做了3件事:
1.将X在B.h中声明,然后在A.h中include B.h
2.在A.h中直接写上 extern X
3.在Makefile中,A.o:B.o(即形成A.o需要B.o)

现在想问是否这三件事都需要做,还是有些重复了。一般是怎样引用一个外部函数.
还有就是一般.h文件中是否声明的都是可能被外部子程序引用的函数,还是凡是在.c文件中出现的函数都必须在.h中进行声明?
谢谢!50分求助

|
楼上已经回答得很充分了
补充一下3:
Makefile中a.o: b.o的意思是
如果b.o有改变,那么a.o需要重新编译
但实际上是:a.o只是调用了b.o中的函数,只要接口不变,即使函数内容变了,a.o都不需要重新编译。
所以应该写成:
a.o: a.c a.h b.h
(这3个变了才应该导致a.o重新编译)
但程序与a.o和b.o有关
bin: a.o b.o

|
简单的方法是看标准源码
以下是从FreeBSD 5.4 的源码中摘出来的
/usr/include/string.h
...
char    *strcpy(char * __restrict, const char * __restrict);
...

/usr/src/lib/libc/string/strcpy.c
...
#include 

char *
strcpy(char * __restrict to, const char * __restrict from)
{
    char *save = to;

    for (; (*to = *from); ++from, ++to);
    return(save);
}
...

在用户程序中如果需要调用strcpy函数
标准的方法是
#include 
从摘string.h摘一行
char    *strcpy(char * __restrict, const char * __restrict)
也是可以的

至于extern关键子,对函数来说,可以省略,全局变量必须使用。

现在回答楼主的问题:
1或者2任选一件,推荐使用1,不过如果X函数只在A中使用,建议在a.c中include b.h
3. 是不必要的,链接时链接上b.o就可以了。

|
楼上正解.

一般接口就是这样写的.不过:
将X在B.h中声明,这是对的,
然后在A.h中include B.h------一般是A.c中include B.h.因为A.h做为A.c的对外接口,不应该有其
他接口的内容.若不然,在一些复杂的系统中,编译会出问题.特别是出现交叉include时比如:a.c要调用b.c
内的一个函数,而b.c又要调用a.c内的函数就会出现a.h内include b.h,b.h内include a.h,有些编译器
就会出问题.当然这种问题是编程方法不好所引起的,但我们要预防这些这中情况的发生.




|
1是完全可以的.
2也是完全可以的.
3个人感觉是不可以的, 因为是编译器依赖, 与链接没有关系. 而且这样会造成makefile很难看, 修改起来很麻烦.

    
 
 

您可能感兴趣的文章:

  • JAVA中函数调用时,能不能向 C/C++一样函数的入口参数可以为传出值(就是引用,或指针)
  • 引用文件函数冲突
  • 用户定义类引用?? iis7站长之家
  • 请问大家一个低级的问题:在windows里显示对话框的函数是AfxMessageBox("OK"),在纯java里怎么用,还要引用什么包吗?
  • 在静态上下文中不能引用非静态方法test(),天啊,为什么我的main()不能调用任何其它函数?
  • 链接时如何取消对某库中没有用到的函数的引用
  • 关于makefile的问题:如果一个目标的两个以上的依赖文件都需要引用相同的库函数该怎么写?
  • c++将引用或者是指针作为函数参数实现实参的运算
  • 请问如何用java实现类似于c中的传引用参数的函数
  • java函数传参数有“传值”与“传引用(指针)”之分吗?
  • 探讨:C++中函数返回引用的注意事项
  • python函数缺省值与引用学习笔记分享
  • c++中拷贝构造函数的参数类型必须是引用
  • Java函数式编程(八):字符串及方法引用
  • 浅析C和C++函数的相互引用
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 你们看是不是可以这样理解:在用来进行两个对象的比较时,==操作符用来比较两个对象的引用地址,而equals()用来比较两个对象的值。
  • HTML5 <blockquote> 标签(定义引用)详细介绍及举例说明
  • Java中弱引用和软引用的区别以及虚引用和强引用介绍
  • JQuery 在线引用及测试引用是否成功
  • c++ const引用与非const引用介绍
  • “当某个实例不再被任何对象引用时就会被垃圾回收机制回收”,那么怎样才算是不被任何对象引用呢?
  • python共享引用(多个变量引用)示例代码
  • java的引用类型的详细介绍
  • 解析Android开发优化之:软引用与弱引用的应用
  • 如何在一个package中引用另一个package中的类?
  • JSP引用JAVABEAN的问题
  • 关于在内核空间和用户空间引用一个空指针的后果很原因
  • 关于环境变量的设置和引用
  • grep 后向引用问题
  • 我的Jbuilder怎么引用我自己编写的Class文件?
  • 在aspx页面引用html页的写法
  • 没人解决吗?我在一个包中如何引用一个未打包的Class?
  • 用户定义类引用??
  • 一个简单的引用的问题
  • EJB间如何引用?
  • iso的头文件怎么在linux下引用啊
  • 请问在C文件中如何引用 C++ 生成库?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3