如何消除有未matlab调用函数的函数而出现的警告

C语言中没有main函数生成可执行程序的几种方法_Linux编程_Linux公社-Linux系统门户网站
你好,游客
C语言中没有main函数生成可执行程序的几种方法
来源:Linux社区&
作者:justlinux2010
1、define预处理指令这种方式很简单,只是简单地将main字符串用宏来代替,或者使用##拼接字符串。示例程序如下:#include &stdio.h&
#define begin main
int begin(void){printf("Hello, World!\n");return 0;}
#include &stdio.h&
#define begin m##a##i##n
int begin(void){printf("Hello, World!\n");return 0;}严格来说,这种方式只算是一种技巧......2、_start函数_start函数是C程序的入口函数,会调用main函数。在调用main函数之前,会先执行_start函数分配必要的资源,然后再调用main函数。但是在用gcc编译程序时可以使用-nostartfiles选项来重写_start函数。示例程序如下:#include &stdio.h&#include &stdlib.h&
_start(void) {printf("Hello, World!\n");exit(0);}编译上面的程序的命令为:gcc -nostartfiles _start.c -o a.out反汇编生成的可执行程序,如下所示:a.out: file format elf64-x86-64
Disassembly of section .plt:
0320 &puts@plt-0x10&:400320: ff 35 ea 01 20 00 pushq 0x2001ea(%rip) # 600510 &_GLOBAL_OFFSET_TABLE_+0x8&400326: ff 25 ec 01 20 00 jmpq *0x2001ec(%rip) # 600518 &_GLOBAL_OFFSET_TABLE_+0x10&40032c: 0f 1f 40 00 nopl 0x0(%rax)
0330 &puts@plt&:400330: ff 25 ea 01 20 00 jmpq *0x2001ea(%rip) # 600520 &_GLOBAL_OFFSET_TABLE_+0x18& 00 00 00 00 pushq $0x040033b: e9 e0 ff ff ff jmpq 400320 &puts@plt-0x10&
0340 &exit@plt&:400340: ff 25 e2 01 20 00 jmpq *0x2001e2(%rip) # 600528 &_GLOBAL_OFFSET_TABLE_+0x20& 01 00 00 00 pushq $0x140034b: e9 d0 ff ff ff jmpq 400320 &puts@plt-0x10&
Disassembly of section .text:
0350 &_start&: push %rbp 89 e5 mov %rsp,%rbp400354: bf 68 03 40 00 mov $0x400368,%edi400359: e8 d2 ff ff ff callq 400330 &puts@plt&40035e: bf 00 00 00 00 mov $0x0,%edi400363: e8 d8 ff ff ff callq 400340 exit@plt 上面的结果是完整的反汇编结果,我们可以看到_start函数中只有我们调用printf和exit函数相关的一些指令,并且.txt段中只有_start函数,没有看到main函数。如果将源代码中的_start替换为main,重新编译程序,反汇编的结果中会看到_start函数会调用到main。另外还有一点需要注意,因为这里重写了_start函数,所以gcc为默认的main函数准备的清理动作就没用上,所以如果退出的时候直接使用return,会导致程序崩溃。所以这里要使用exit()来退出程序。具体的原因可以参见这篇文章。3、gcc的-e选项示例程序如下:#include &stdio.h&#include &stdlib.h&
int nomain(int i, int j, int k) {printf("Hello, World!\n");exit(0);}将上面的程序保存为m.c,编译命令如下所示:gcc -nostartfiles -e nomain m.c -o a.out继续使用objdump反汇编生成的可执行程序,结果如下:a.out: file format elf64-x86-64
Disassembly of section .plt:
0320 &puts@plt-0x10&:400320: ff 35 f2 01 20 00 pushq 0x2001f2(%rip) # 600518 &_GLOBAL_OFFSET_TABLE_+0x8&400326: ff 25 f4 01 20 00 jmpq *0x2001f4(%rip) # 600520 &_GLOBAL_OFFSET_TABLE_+0x10&40032c: 0f 1f 40 00 nopl 0x0(%rax)
0330 &puts@plt&:400330: ff 25 f2 01 20 00 jmpq *0x2001f2(%rip) # 600528 &_GLOBAL_OFFSET_TABLE_+0x18& 00 00 00 00 pushq $0x040033b: e9 e0 ff ff ff jmpq 400320 &puts@plt-0x10&
0340 &exit@plt&:400340: ff 25 ea 01 20 00 jmpq *0x2001ea(%rip) # 600530 &_GLOBAL_OFFSET_TABLE_+0x20& 01 00 00 00 pushq $0x140034b: e9 d0 ff ff ff jmpq 400320 &puts@plt-0x10&
Disassembly of section .text:
0350 &nomain&: push %rbp 89 e5 mov %rsp,%rbp 83 ec 10 sub $0x10,%rsp 7d fc mov %edi,-0x4(%rbp)40035b: 89 75 f8 mov %esi,-0x8(%rbp)40035e: 89 55 f4 mov %edx,-0xc(%rbp)400361: bf 75 03 40 00 mov $0x400375,%edi400366: e8 c5 ff ff ff callq 400330 &puts@plt&40036b: bf 00 00 00 00 mov $0x0,%edi400370: e8 cb ff ff ff callq 400340 &exit@plt&从上面我们可以看到指定的nomain函数位于.text段的开始位置,同样在函数结束的时候没有gcc为main函数准备的清理动作,所以在这里也只能使用exit()来退出程序,而不能使用return。4、nostartfiles选项前面已经多次使用了该选项,不过都是配合其他选项使用的,这个选项也可以单独使用,其含义为"Do not use the standard system startup files when linking"。示例程序如下:#include &stdio.h&#include &stdlib.h&
void func() {printf("I am func....\n");}
int nomain1(int i, int j, int k) {func();printf("%s: Hello, World!\n", __func__);exit(0);}上面的程序保存为k.c,然后使用下面的命令编译:[root@_190 ~]# gcc -nostartfiles p.c/usr/bin/ld: warning: cannot find entry symbol _ defaulting to 0398在单独使用nostartfiles选项时会报警告,生成的可执行程序可以执行,但是会产生段错误,去掉对func()函数的调用就不会产生段错误了。将生成的可执行程序反汇编,和使用前面的方法生成可执行程序的反汇编结果比较,发现除了函数名不一样外,没有其他区别,不知道为什么会产生段错误。知道的麻烦告知一声,拜谢!
相关阅读:
C语言变长数组之剖析
C语言需要注意的问题
C语言位域的使用及其注意点
相关资讯 & & &
& (03月14日)
& (07/25/:51)
& (07月28日)
& (03月14日)
& (03/15/:43)
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款[Keil]如何消除有未调用的函数而出现的警告?_图文_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
[Keil]如何消除有未调用的函数而出现的警告?
&&[Keil]如何消除有未调用的函数而出现的警告?
阅读已结束,下载文档到电脑
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,方便使用
还剩2页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢Keil C编译器常见警告与错误信息的解决方法_文档下载
亿万文档 免费下载
当前位置: &
& Keil C编译器常见警告与错误信息的解决方法
Keil C编译器常见警告与错误信息的解决方法
Keil C编译器常见警告与错误信息的解决方法
Warning 280:’i’:unreferenced local variable说明局部变量i在函数中未作任何的存取操作解决方法消除函数中i变量的宣告2Warning 206:’Music3’:missing function-prototype说明Music3( )函数未作宣告或未作外部宣告所以无法给其他函数调用解决方法将叙述void Music3(void)写在程序的最前端作宣告如果是其他文件的函数则要写成extern void Music3(void),即作外部宣告
3Compling :C:\8051\MANN.C
Error:318:can’t open file ‘beep.h’
说明在编译C:\8051\MANN.C程序过程中由于main.c用了指令#include “beep.h”,但却找不到所致
解决方法编写一个beep.h的包含档并存入到c:\8051的工作目录中
4Compling:C:\8051\LED.C
Error 237:’LedOn’:function already has a body
说明LedOn( )函数名称重复定义即有两个以上一样的函数名称
解决方法修正其中的一个函数名称使得函数名称都是独立的
5***WARNING 16:UNCALLED SEGMENT,IGNORED FOR OVERLAY PROCESSSEGMENT: ?PR?_DELAYX1MS?DELAY
说明DelayX1ms( )函数未被其它函数调用也会占用程序记忆体空间
解决方法去掉DelayX1ms( )函数或利用条件编译#if …..#endif,可保留该函数并不编译
6***WARNING 6 :XDATA SPACE MEMORY OVERLAP
FROM : 0025H
说明外部资料ROM的0025H重复定义地址
解决方法外部资料ROM的定义如下
Pdata unsigned char XFR_ADC _at_0x25其中XFR_ADC变量的名称为0x25,请检查是否有其它的变量名称也是定义在0x25处并修正它
7WARNING 206:’DelayX1ms’: missing function-prototype
C:\8051\INPUT.C
Error 267 :’DelayX1ms ‘:requires ANSI-style prototype C:\8051\INPUT.C
函数但该函数没定义即未编写程序内容或函数说明程序中有调用DelayX1ms
已定义但未作宣告
解决方法编写DelayX1ms的内容编写完后也要作宣告或作外部宣告可在delay.h
以便其它函数调用的包含档宣告成外部
8***WARNING 1:UNRESOLVED EXTERNAL SYMBOL
SYMBOL:MUSIC3
MODULE:C:\8051\MUSIC.OBJ(MUSIC)
***WARNING 2:REFERENCE MADE TO UNRESOLVED EXTERNAL
SYMBOL:MUSIC3
MODULE:C:\8051\MUSIC.OBJ(MUSIC)
ADDRESS:0018H
函数但未将该函数的含扩档说明程序中有调用MUSICC加入到工程档
Word文档免费下载: (下载1-2页,共2页)
Keil+C编译器常见警告与错误信息的解决方法_IT/计算机_专业资料。非常好,一定能找到你的错误。喜欢就下吧! 别忘了评价!!!本章列出了编程中可能遇到的致命错误 ...Keil C编译器常见警告与错误信息的解决方法_教学案例/设计_教学研究_教育专区。Keil C 编译器常见警告与错误信息的解决方法 1. Warning 280:’i’:unreferenced lo...KEIL C编译器常见警告与错误信息的解决办法_信息与通信_工程科技_专业资料。KEIL C编译器常见警告与错误信息的解决办法KEIL C 编译器常见警告与错误信息的解决办法 ...Keil C 编译器常见警告与错误信息的解决方法_电子/电路_工程科技_专业资料。1. Warning 280:?i?:unreferenced local variable 说明局部变量 i 在函数中未作任何的...Keil C 编译器常见警告与错误信息_IT/计算机_专业资料。Keil C编译器的常见错误类型与解决方法;Keil C 编译器常见警告与错误信息
19:17:04 error ...KEIL 编译器常见警告与错误信息的解决办法 1. Warning 280:’i’:unreferenced ...C_C51STARTUP 该警告表示连接器发现有一个函数可能会被主函数和一个中断服务...C51-keil编译常见错误和... 17页 1下载券 keil警告的处理 2页 4下载券 keil...C 编译器错误信息中文翻译 Ambiguous operators need parentheses 不明确的运算需要...C51-keil编译常见错误和警告处理_电子/电路_工程科技_专业资料。keil 错误 C51 ...&错误信息& terminated C_51 TERMINATED C_51 (1) ACTION 的有关信息 *PARSIN...KEIL C 编译器常见警告与错误信息的解决办法 1. Warning 280:’i’:unreferenced local variable 说明局部变量 i 在函数中未作任何的存取操作 解决方法消除函数中...显式默认设置的函数和已删除的函数
显式默认设置的函数和已删除的函数
显式默认设置的函数和已删除的函数
Visual Studio 2015
若要了解有关 Visual Studio 2017 RC 的最新文档,请参阅 。在 C++11 中,默认函数和已删除函数使你可以显式控制是否自动生成特殊成员函数。
已删除的函数还可为您提供简单语言,以防止所有类型的函数(特殊成员函数和普通成员函数以及非成员函数)的参数中出现有问题的类型提升,这会导致意外的函数调用。在 C++ 中,如果某个类型未声明它本身,则编译器将自动为该类型生成默认构造函数、复制构造函数、复制赋值运算符和析构函数。
这些函数称为特殊成员函数,它们使 C++ 中的简单用户定义类型的行为如同 C 中的结构。
也就是说,可以创建、复制和销毁它们而无需任何额外编码工作。
C++11 会将移动语义引入语言中,并将移动构造函数和移动赋值运算符添加到编译器可自动生成的特殊成员函数的列表中。这对于简单类型非常方便,但是复杂类型通常自己定义一个或多个特殊成员函数,这可以阻止自动生成其他特殊成员函数。
实践操作:如果显式声明了任何构造函数,则不会自动生成默认构造函数。如果显式声明了虚拟析构函数,则不会自动生成默认析构函数。如果显式声明了移动构造函数或移动赋值运算符,则:不自动生成复制构造函数。不自动生成复制赋值运算符。如果显式声明了复制构造函数、复制赋值运算符、移动构造函数、移动赋值运算符或析构函数,则:不自动生成移动构造函数。不自动生成移动赋值运算符。 说明
此外,C++11 标准指定将以下附加规则:如果显式声明了复制构造函数或析构函数,则弃用复制赋值运算符的自动生成。如果显式声明了复制赋值运算符或析构函数,则弃用复制构造函数的自动生成。在这两种情况下,Visual Studio 将继续隐式自动生成所需的函数且不发出警告。这些规则的结果也可能泄漏到对象层次结构中。
例如,如果基类因某种原因无法拥有可从派生类调用的默认构造函数 - 也就是说,一个不采用任何参数的 public 或 protected 构造函数 - 那么从基类派生的类将无法自动生成它自己的默认构造函数。这些规则可能会使本应直接的内容、用户定义类型和常见 C++ 惯例的实现变得复杂 — 例如,通过以私有方式复制构造函数和复制赋值运算符,而不定义它们,使用户定义类型不可复制。
struct noncopyable
noncopyable() {};
noncopyable(const noncopyable&);
noncopyable& operator=(const noncopyable&);
在 C++11 之前,此代码段是不可复制的类型的惯例形式。
但是,它具有几个问题:复制构造函数必须以私有方式进行声明以隐藏它,但因为它进行了完全声明,所以会阻止自动生成默认构造函数。
如果你需要默认构造函数,则必须显式定义一个(即使它不执行任何操作)。即使显式定义的默认构造函数不执行任何操作,编译器也会将它视为重要内容。
其效率低于自动生成的默认构造函数,并且会阻止 noncopyable 成为真正的 POD 类型。尽管复制构造函数和复制赋值运算符在外部代码中是隐藏的,但成员函数和 noncopyable 的友元仍可以看见并调用它们。
如果它们进行了声明但是未定义,则调用它们会导致链接器错误。虽然这是广为接受的惯例,但是除非你了解用于自动生成特殊成员函数的所有规则,否则意图不明确。在 C++11 中,不可复制的习语可通过更直接的方法实现。
struct noncopyable
noncopyable() =
noncopyable(const noncopyable&) =
noncopyable& operator=(const noncopyable&) =
请注意如何解决与 C++11 之前的惯例有关的问题:仍可通过声明复制构造函数来阻止生成默认构造函数,但可通过将其显式设置为默认值进行恢复。显式设置的默认特殊成员函数仍被视为不重要的,因此性能不会下降,并且不会阻止 noncopyable 成为真正的 POD 类型。复制构造函数和复制赋值运算符是公共的,但是已删除。
定义或调用已删除函数是编译时错误。对于了解 =default 和 =delete 的人来说,意图是非常清楚的。
你不必了解用于自动生成特殊成员函数的规则。对于创建不可移动、只能动态分配或无法动态分配的用户定义类型,存在类似惯例。
所有这些惯例都具有 C++11 之前的实现,这些实现会遭受类似问题,并且可在 C++11 中通过按照默认和已删除特殊成员函数实现它们,以类似方式进行解决。可以默认设置任何特殊成员函数 — 以显式声明特殊成员函数使用默认实现、定义具有非公共访问限定符的特殊成员函数或恢复其他情况下被阻止其自动生成的特殊成员函数。可通过如此示例所示进行声明来默认设置特殊成员函数:
struct widget
inline widget& operator=(const widget&);
inline widget& widget::operator=(const widget&) =
请注意,只要特殊成员函数可内联,便可以在类主体外部默认设置它。由于普通特殊成员函数的性能优势,因此我们建议你在需要默认行为时首选自动生成的特殊成员函数而不是空函数体。
你可以通过显式默认设置特殊成员函数,或通过不声明它(也不声明其他会阻止它自动生成的特殊成员函数),来实现此目的。 说明 Visual Studio 不支持默认的移动构造函数或移动赋值运算符作为 C++11 标准授权。
有关详细信息,请参阅 中的“默认函数和已删除的函数”一节。可以删除特殊成员函数以及普通成员函数和非成员函数,以阻止定义或调用它们。
通过删除特殊成员函数,可以更简洁地阻止编译器生成不需要的特殊成员函数。
必须在声明函数时将其删除;不能在这之后通过声明一个函数然后不再使用的方式来将其删除。
struct widget
// deleted operator new prevents widget from being dynamically allocated.
void* operator new(std::size_t) =
删除普通成员函数或非成员函数可阻止有问题的类型提升导致调用意外函数。
这可发挥作用的原因是,已删除的函数仍参与重载决策,并提供比提升类型之后可能调用的函数更好的匹配。
函数调用将解析为更具体的但可删除的函数,并会导致编译器错误。
// deleted overload prevents call through type promotion of float to double from succeeding.
void call_with_true_double_only(float) =
void call_with_true_double_only(double param) { }
请注意,在前面的示例中,使用 call_with_true_double_only 参数调用 float 将导致编译器错误,但使用 call_with_true_double_only 参数调用 int 不会导致编译器错误;在 int 示例中,此参数将从 int 提升到 double,并成功调用函数的 double 版本,即使这可能并不是预期目的。
若要确保使用非双精度参数对此函数进行的任何调用均会导致编译器错误,您可以声明已删除的函数的模板版本。
template & typename T &
void call_with_true_double_only(T) = //prevent call through type promotion of any T to double from succeeding.
void call_with_true_double_only(double param) { } // also define for const double, double&, etc. as needed.
此页面有帮助吗?
更多反馈?
1500 个剩余字符
我们非常感谢您的反馈。编译时禁止多余部分分配空间(如:禁止未调用函数参与编译)避免浪费code空间和警告?TKStudio和keil
平时习惯将一些常用的驱动、运算……各种程序做成模块,方便以后调用,
但实际运用时某模块的某些函数在工程中用不上,这时编译不但会产生xxx函数未调用的警告,而且浪费code程序空间,有时甚至无法通过编译,
通过一个个注释 或者 加宏定义开关 很麻烦,尤其未调用的函数数目很多时,
将各个函数编译成lib库可以,但接口、常量就不能随意改变了……
【默认配置编译时,TKStudio和keil编译结果都如下图】
【结果这样不但牺牲了代码优化,依旧警告,而且代码更加臃肿】
Keil使用"REMOVEUNUSED"就可以简单实现:
把target options中的device页中选上"Use LX51
最后在LX51 Misc页中的Misc Control中填入"REMOVEUNUSED",
确认后重新编译即可自动去掉未调用的函数。
【接着使用Keil的优化级别9将代码优化,还可以进一步节省程序空间:】
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 python 调用函数 的文章

 

随机推荐