完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
为了提高性能,我想用XC32编译器内联一个函数。为了实现这一点,我有一个源文件,其中函数定义如下:在头文件“foo.h”中,内联void foo(void){.}我有第三个文件中的:extern void foo(void),我有调用部分:#include“foo.h”foo()R结果:通过分解可以看到,foo函数不是“内联的”,尽管我有O1优化和-finline选项。我肯定在某处犯了错误,或者我忘记了什么。从XC32帮助我读取内联和外置的组合或静态也可以使用。我不清楚。有什么建议吗?
|
|
相关推荐
13个回答
|
|
|
不可能内联一个外部函数。编译器完全不知道这个函数可能是什么,因此它不能内联它。对于内联,编译器需要有一个完整的函数定义。
|
|
|
|
|
|
是的,我能理解。我想模仿PLIB中的操作。所有的PLIB函数都被定义为“PLIB_INLINE_API”,PLIB_INLINE_API被定义为“外部内联”,例如在ports_p32mz2048efm144.h中。是因为某个地方有.LIB吗?
|
|
|
|
|
|
对我来说是毫无意义的。当内联函数时,它不再是函数,而是代码的一部分,因此不再有任何与之关联的符号。如果您想将其作为其他C文件的函数公开,则不能将其内联。因此,这种组合可能有一些特殊的意义(编译器特定的?)但我从来没有听说过。
|
|
|
|
|
|
嗨,组合的含义:extern inlineis:如果可能,在这个编译单元中调用时内联这个函数。如果函数不能内联,不要在这个编译单元中自己编译函数,创建对在其他编译单元中编译的外部函数的调用。最简单的用法是:静态内联foo(void){...}完整函数的源代码必须在.c源文件中或在#includeded文件中可用。编译器将决定是否将foo函数编译为内联代码,还是在当前编译中将foo函数编译为内部函数。离子单元。如果使用外部内联,则要内联的函数必须存在于至少两个不同的编译单元中。在要调用该函数的文件中,要内联的函数被编码:外部内联foo(void){...}。foo() ;然后在一个单独的编译单元,一个单独的文件,即“库构建”,foo函数将在没有内联关键字:foo(void){...}的情况下编译。在XC32编译器中是可用的,以便在使用优化进行编译时也执行内联-O0_.((._inline)),优化可以与内联关键字一起使用:
|
|
|
|
|
|
的确,内联函数只有在它的定义在源文件中调用时才起作用。第二步:将它的代码与HApp的其他调用部分共享,我试图产生一个包含在代码中的标题,例如,iIFNDEF FooHyth*。E-Link我得到了一个多定义的错误,好像没有定义FooHyh。编译器中有bug吗?
|
|
|
|
|
|
谢谢你,Mysil。我一定会尝试所有这些。
|
|
|
|
|
|
因为您在标题中包括了函数,所以将创建该函数的多个版本,每次包含标题时一个版本。这将导致链接器出现问题。
|
|
|
|
|
|
谢谢你,西蒙123。我必须承认,我不明白为什么会创建多个版本的函数。这不是为了避免这一点吗?
|
|
|
|
|
|
嗨,在.c源代码中的关键字区分大小写:内联是用小写字母编写的。要查看它是如何在Harmony中完成的,请仔细查看PLIB_INLINE_API宏是如何在外围设备device.chiptype h中有条件定义的。
|
|
|
|
|
|
这与您在post#2中发布的相反。在那里,PLIB_INLINE被定义为“静态内联”,意思是编译器应该尝试内联函数,并且应该使其对外部文件不可见。相比之下,PiBixInLyLayAPI被定义为“Extn”。这对我来说很有意义。私有PLIB_INLINE函数和公共PLIB_INLINE_API函数。在本例中,它们都是“外部内联”,这意味着它们必须发布到外部。不再有隐私。很容易发现外部文件在查看这个头时会忽略“内联”。但是,如果C文件具有函数的定义,则它必须生成函数的可调用(非内联)版本,以便其他文件可以使用它。但是,我猜,它可能决定不对位于相同文件和创建内联代码版本的函数使用这个可调用版本。而且,没有什么可以阻止它忽略“内联”,并且仍然链接到可调用版本,因为它已经存在。它的处理方式也可能取决于调用是在函数定义之前还是在.@flatbush之后发生:您可以查看所有这些情况,并在这里发布实际发生的情况。
|
|
|
|
|
|
include保护的目的是防止在编译单个源文件期间不止一次地处理头文件的内容。每个源文件分别编译,并且预处理器宏在编译器调用之间不持久。
|
|
|
|
|
|
简单地分解一下,考虑以下文件:-foo.h bar.h func 1.cfunc2.c.derfunc1.c。通过加载foo.h和bar.h,foo.h被加载两次。正如您已经知道的,“guard”定义阻止实际处理两次内容,因此实际上在func1.o中只创建了一个foo()副本。到目前为止,还不错。现在考虑func2.c。它通过bar.h加载foo.h,所以在func2.o中创建了另一个foo()副本。查看foo()的两个副本,然后放弃重复的定义错误,因为它不知道在哪里包括哪个。这告诉编译器foo()的每个定义只能从其相应的模块(func1.c和func2.c)中看到,所以链接器知道foo()的哪个副本来自哪里,并且可以保存这两个副本。权限,所以来链接时间链接器看到两个完全不同的功能。
|
|
|
|
|
|
Whaouu,谢谢大家。幸运的是,我从来都不喜欢把代码放在头文件中。我曾经编写宏,所以我从来没有遇到过在头中定义的子例程被应用程序的几个部分看到的情况。保持“全球”标识的最后一个好定义:谢谢你打开我的眼睛。迟到总比不好。
|
|
|
|
|
只有小组成员才能发言,加入小组>>
MPLAB X IDE V6.25版本怎么对bootloader和应用程序进行烧录
495 浏览 0 评论
5808 浏览 9 评论
2347 浏览 8 评论
2237 浏览 10 评论
请问是否能把一个ADC值转换成两个字节用来设置PWM占空比?
3542 浏览 3 评论
1151浏览 1评论
有偿咨询,关于MPLAB X IPE烧录PIC32MX所遇到的问题
1117浏览 1评论
我是Microchip 的代理商,有PIC16F1829T-I/SS 技术问题可以咨询我,微信:A-chip-Ti
885浏览 1评论
MPLAB X IDE V6.25版本怎么对bootloader和应用程序进行烧录
495浏览 0评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-11 08:24 , Processed in 0.982362 second(s), Total 96, Slave 79 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
1507