不可以在一个函数中定义另一个函数 ,那为什么可以在main三角函数定义义了,怎么理解了?

vc++一个工程里面为什么不能有两个main函数呢
[问题点数:20分,结帖人ganli0111]
vc++一个工程里面为什么不能有两个main函数呢
[问题点数:20分,结帖人ganli0111]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2010年7月 VC/MFC大版内专家分月排行榜第三2010年6月 VC/MFC大版内专家分月排行榜第三
2005年8月 硬件/嵌入开发大版内专家分月排行榜第二2005年7月 硬件/嵌入开发大版内专家分月排行榜第二
2008年2月 VB大版内专家分月排行榜第一2003年4月 VC/MFC大版内专家分月排行榜第一2002年11月 VC/MFC大版内专家分月排行榜第一
2011年11月 VC/MFC大版内专家分月排行榜第二2008年3月 VB大版内专家分月排行榜第二2008年3月 硬件/嵌入开发大版内专家分月排行榜第二2003年4月 其他开发语言大版内专家分月排行榜第二2003年4月 VB大版内专家分月排行榜第二2003年3月 VB大版内专家分月排行榜第二
2008年2月 VB大版内专家分月排行榜第一2003年4月 VC/MFC大版内专家分月排行榜第一2002年11月 VC/MFC大版内专家分月排行榜第一
2011年11月 VC/MFC大版内专家分月排行榜第二2008年3月 VB大版内专家分月排行榜第二2008年3月 硬件/嵌入开发大版内专家分月排行榜第二2003年4月 其他开发语言大版内专家分月排行榜第二2003年4月 VB大版内专家分月排行榜第二2003年3月 VB大版内专家分月排行榜第二
2003年9月 C/C++大版内专家分月排行榜第二2002年6月 C/C++大版内专家分月排行榜第二2002年4月 C/C++大版内专家分月排行榜第二
2007年3月 C/C++大版内专家分月排行榜第三2007年2月 C/C++大版内专家分月排行榜第三2007年1月 C/C++大版内专家分月排行榜第三2003年7月 C/C++大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。9793人阅读
STM32F(21)
开发工具(22)
//=====================================================================//TITLE://&&& main函数之前究竟发生了什么?//AUTHOR://&&& norains//DATE://&&& Friday& 3-December-2010//Environment://&&& MDK 4.1//=====================================================================
&&& &当使用MFC时,我们会认为入口函数是:: InitInstance;当使用WIN32 API时,我们会认为入口函数是WinMain;当我们写个纯粹的C++程序时,入口函数又变成了main;可当我们进入到嵌入式领域,却发现main函数之前还有一段启动代码!
&&&& 究竟在main函数之前,发生了什么?如果你觉得已经明白了这个过程,那么请试着回答这个问题:程序是存储到FLASH中的,运行时static变量地址是指向RAM,那么这些static变量的初始值是如何映射到RAM中的?
&&&& 我们以STM32F10x的启动代码为例,先看看其完整的源码:
&textarea cols=&50& rows=&15& name=&code& class=&c-sharp&&;/*****************************************************************************/
;/* STM32F10x.s: Startup file for ST STM32F10x device series
;/*****************************************************************************/
;/* &&& Use Configuration Wizard in Context Menu &&&
;/*****************************************************************************/
;/* This file is part of the uVision/ARM development tools.
;/* Copyright (c)
Keil Software. All rights reserved.
;/* This software may only be used under the terms of a valid, current,
;/* end user licence from KEIL for a compatible version of KEIL software
;/* development tools. Nothing else gives you the right to use this software. */
;/*****************************************************************************/
;// &h& Stack Configuration
&o& Stack Size (in Bytes) &0x0-0xFFFFFFFF:8&
Stack_Size
STACK, NOINIT, READWRITE, ALIGN=3
Stack_Size
__initial_sp
;// &h& Heap Configuration
Heap Size (in Bytes) &0x0-0xFFFFFFFF:8&
HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
__heap_limit
; Vector Table Mapped to Address 0 at Reset
RESET, DATA, READONLY
__initial_ Top of Stack
Reset_H Reset Handler
NMI_Ha NMI Handler
HardFault_H Hard Fault Handler
MemManage_H MPU Fault Handler
BusFault_H Bus Fault Handler
UsageFault_H Usage Fault Handler
SVC_Ha SVCall Handler
DebugMon_H Debug Monitor Handler
PendSV_H PendSV Handler
SysTick_H SysTick Handler
External Interrupts
WWDG_IRQH Window Watchdog
PVD_IRQH PVD through EXTI Line detect
TAMPER_IRQH Tamper
RTC_IRQH RTC
FLASH_IRQH Flash
RCC_IRQH RCC
EXTI0_IRQH EXTI Line 0
EXTI1_IRQH EXTI Line 1
EXTI2_IRQH EXTI Line 2
EXTI3_IRQH EXTI Line 3
EXTI4_IRQH EXTI Line 4
DMAChannel1_IRQH DMA Channel 1
DMAChannel2_IRQH DMA Channel 2
DMAChannel3_IRQH DMA Channel 3
DMAChannel4_IRQH DMA Channel 4
DMAChannel5_IRQH DMA Channel 5
DMAChannel6_IRQH DMA Channel 6
DMAChannel7_IRQH DMA Channel 7
ADC_IRQH ADC
USB_HP_CAN_TX_IRQH USB High Priority or CAN TX
USB_LP_CAN_RX0_IRQH USB Low
Priority or CAN RX0
CAN_RX1_IRQH CAN RX1
CAN_SCE_IRQH CAN SCE
EXTI9_5_IRQH EXTI Line 9..5
TIM1_BRK_IRQH TIM1 Break
TIM1_UP_IRQH TIM1 Update
TIM1_TRG_COM_IRQH TIM1 Trigger and Commutation
TIM1_CC_IRQH TIM1 Capture Compare
TIM2_IRQH TIM2
TIM3_IRQH TIM3
TIM4_IRQH TIM4
I2C1_EV_IRQH I2C1 Event
I2C1_ER_IRQH I2C1 Error
I2C2_EV_IRQH I2C2 Event
I2C2_ER_IRQH I2C2 Error
SPI1_IRQH SPI1
SPI2_IRQH SPI2
USART1_IRQH USART1
USART2_IRQH USART2
USART3_IRQH USART3
EXTI15_10_IRQH EXTI Line 15..10
RTCAlarm_IRQH RTC Alarm through EXTI Line
USBWakeUp_IRQH USB Wakeup from suspend
|.text|, CODE, READONLY
; Reset Handler
Reset_Handler
Reset_Handler
R0, =__main
; Dummy Exception Handlers (infinite loops which can be modified)
NMI_Handler
NMI_Handler
HardFault_Handler/
HardFault_Handler
MemManage_Handler/
MemManage_Handler
BusFault_Handler/
BusFault_Handler
UsageFault_Handler/
UsageFault_Handler
SVC_Handler
SVC_Handler
DebugMon_Handler/
DebugMon_Handler
PendSV_Handler
PendSV_Handler
SysTick_Handler PROC
SysTick_Handler
Default_Handler PROC
WWDG_IRQHandler
PVD_IRQHandler
TAMPER_IRQHandler
RTC_IRQHandler
FLASH_IRQHandler
RCC_IRQHandler
EXTI0_IRQHandler
EXTI1_IRQHandler
EXTI2_IRQHandler
EXTI3_IRQHandler
EXTI4_IRQHandler
DMAChannel1_IRQHandler
DMAChannel2_IRQHandler
DMAChannel3_IRQHandler
DMAChannel4_IRQHandler
DMAChannel5_IRQHandler
DMAChannel6_IRQHandler
DMAChannel7_IRQHandler
ADC_IRQHandler
USB_HP_CAN_TX_IRQHandler
USB_LP_CAN_RX0_IRQHandler [WEAK]
CAN_RX1_IRQHandler
CAN_SCE_IRQHandler
EXTI9_5_IRQHandler
TIM1_BRK_IRQHandler
TIM1_UP_IRQHandler
TIM1_TRG_COM_IRQHandler
TIM1_CC_IRQHandler
TIM2_IRQHandler
TIM3_IRQHandler
TIM4_IRQHandler
I2C1_EV_IRQHandler
I2C1_ER_IRQHandler
I2C2_EV_IRQHandler
I2C2_ER_IRQHandler
SPI1_IRQHandler
SPI2_IRQHandler
USART1_IRQHandler
USART2_IRQHandler
USART3_IRQHandler
EXTI15_10_IRQHandler
RTCAlarm_IRQHandler
USBWakeUp_IRQHandler
WWDG_IRQHandler
PVD_IRQHandler
TAMPER_IRQHandler
RTC_IRQHandler
FLASH_IRQHandler
RCC_IRQHandler
EXTI0_IRQHandler
EXTI1_IRQHandler
EXTI2_IRQHandler
EXTI3_IRQHandler
EXTI4_IRQHandler
DMAChannel1_IRQHandler
DMAChannel2_IRQHandler
DMAChannel3_IRQHandler
DMAChannel4_IRQHandler
DMAChannel5_IRQHandler
DMAChannel6_IRQHandler
DMAChannel7_IRQHandler
ADC_IRQHandler
USB_HP_CAN_TX_IRQHandler
USB_LP_CAN_RX0_IRQHandler
CAN_RX1_IRQHandler
CAN_SCE_IRQHandler
EXTI9_5_IRQHandler
TIM1_BRK_IRQHandler
TIM1_UP_IRQHandler
TIM1_TRG_COM_IRQHandler
TIM1_CC_IRQHandler
TIM2_IRQHandler
TIM3_IRQHandler
TIM4_IRQHandler
I2C1_EV_IRQHandler
I2C1_ER_IRQHandler
I2C2_EV_IRQHandler
I2C2_ER_IRQHandler
SPI1_IRQHandler
SPI2_IRQHandler
USART1_IRQHandler
USART2_IRQHandler
USART3_IRQHandler
EXTI15_10_IRQHandler
RTCAlarm_IRQHandler
USBWakeUp_IRQHandler
; User Initial Stack & Heap
:DEF:__MICROLIB
__initial_sp
__heap_base
__heap_limit
__use_two_region_memory
__user_initial_stackheap
__user_initial_stackheap
R1, =(Stack_Mem + Stack_Size)
R2, = (Heap_Mem +
Heap_Size)
R3, = Stack_Mem
&/textarea&
&&&& 一些旁枝末节和本文的主题无关,我们先不要去理会,只需要知道这个启动代码是设置向量表,然后跳转到__main函数。跳转具体到代码段部分如下:&textarea cols=&50& rows=&15& name=&code& class=&c-sharp&&Reset_Handler
Reset_Handler
R0, =__main
ENDP&/textarea&
&&&& 当大家看到__main函数时,估计应该有不少人认为这个是main函数的别名或是编译之后的名字,否则在启动代码中再也无法找到和main相关的字眼了。可事实是,__main和main是完全两个不同的函数!如果这还不足以让你诧异,那么再告诉你另一个事实:你无法找到__main代码,因为这个是编译器自动创建的!
&&&& 如果你对此还半信半疑,可以查看MDK的文档,会发现有这么一句说明:It is automatically created by the linker when it sees a definition of main()。简单点来说,当编译器发现定义了main函数,那么就会自动创建__main。
&&&& __main函数的出身我们基本搞清楚了,那么现在的问题是,它和main又有什么关系呢?其实__main主要做这么两件事:初始化C/C++所需的资源,调用main函数。初始化先暂时不说,但&调用main函数&这个功能能够让我们解决为什么之前的启动代码调用的是__main,最后却能转到main函数的疑惑。
&&&& 初始化C/C++所需的资源,如果脱离了具体情况,实在很难解释清楚,还是先看看编译出来的汇编代码片段:&
&&&& 凡是以__rt开头的,都是用来初始化C/C++运行库的;而以__scatterload开头,则是根据离散文件的定义,将代码中的变量映射到相应的内存位置。而回答本文开头的问题,关键就在于__scatterload_copy函数!
&&&& 我们在STM32F10x平台举个简单的例子,首先要明白一点是,该平台的的flash地址以0x为起始,主要是存储代码;而SRAM是以0x为起始,也就是内存。然后C/C++有这么一行代码:&textarea cols=&50& rows=&15& name=&code& class=&cpp&&static int g_iVal = 12;&/textarea&
&&&& 当我们程序开始跑起来的时候,通过IDE发现,g_iVal被映射到内存地址0x,数值为一个随机数0xFFFFBE00,而不是代码中设置的12,如图:
&&&& 我们让程序继续往下执行,当执行完毕__scatterload_copy之后,我们发现g_iVal这时候已经变成我们所需要的初始值了:
&&&& 接下来就是C/C++库的初始化,最后就是进入到main函数,而此时已经是万事俱备。
&&&& 如果大家只是局限于桌面应用的开发,因为编译出来的程序带有很多操作系统的特性,所以会给我们理解程序的运行带来很大的迷惑,也只有步入嵌入式领域,没有操作系统的支持下赤裸裸地奔跑在CPU之上,才能更好地理解软件是如何运行起来的,也只有这时候我们才能够更清楚知道,原来main函数并不是起点。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:5069414次
积分:55619
积分:55619
排名:第31名
原创:496篇
转载:15篇
评论:12997条
文章:128篇
阅读:2973449
(1)(1)(1)(1)(5)(1)(9)(6)(9)(9)(12)(9)(9)(7)(9)(9)(9)(9)(13)(14)(10)(6)(12)(2)(7)(4)(7)(14)(13)(18)(3)(4)(8)(5)(12)(7)(6)(6)(6)(1)(4)(3)(8)(3)(2)(14)(4)(2)(2)(1)(3)(6)(3)(8)(8)(5)(4)(12)(11)(4)(5)(3)(4)(2)(2)(6)(10)(8)(2)(13)(4)(4)(4)(4)(6)(5)(4)(12)(3)(5)(2)(2)& & 5.1.2.2.1 Program startup
& & The cal at program startup is named main.The implementation declares no
& & prototype for this .It shall be defined with a return type of int and with no
& & parameters:
& & int main(void) { /* ... */ }
& & or with twoparameters (referred to here as argc and argv,though anynames may be
& & used, as theyare al to the in whh theyare declared):
& & int main(int argc, char *argv[]) { /* ... */ }
& &9)or in some other implementation-defined manner.
& & 从C99标准的规定里可以看出,main函数的标准定义一般为这两种形式:
& & 第一种形式:
& & int main (void)
& & return 0;
& & 第二种形式:
& & int main (int argc, char *argv[ ])
& & return 0;
& & 第一种定义main函数不带形参,写起来比较简便。编写单片机C语言程序是不需要通过操纵系统向main函数传递参数的,所以笔者推荐采用第一种标准定义。
& & 标准的意义在于通用,对C语言来讲,符合标准意味着代码的可移植好。如果main函数不符合C99标准也没关系,只要编译器支持,对您的程序没有任何影响。到目前为止,没有哪个C编译器完全遵循C99标准,这都是为了让编译器兼容以前的代码,这也是为什么C标准十几年才修改一次的原因。当然,这并不代表新标准形同虚设,从发展趋势来看,C编译器都会逐渐向新标准靠拢。
& & 既然有了标准我们就应该遵循。我们可以用权威标准来衡量一个代码的优劣,去批判&另类&代码,写出标准的C代码,提高代码的可移植性。
本网站试开通微、小企业商家广告业务;维修点推荐项目。收费实惠有效果!欢迎在QQ或邮箱联系!
试试再找找您想看的资料
资料搜索:
查看相关资料 & & &
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款
copyright & &广电电器(中国梧州) -all right reserved& 若您有什么意见或建议请mail: & &
地址: 电话:(86)774-2826670&为什么C++语言不允许在一个函数的定义中再定义另一个函数?举个例子说明,
人生如梦324
//头文件test.hvoid f();//源文件test.cpp#include"test.h"void f(){... g();...}提示找不到函数g().一般函数的声明与定义放在不同文件中,声明的头文件中只有嵌套定义的外层函数,嵌套在函数f中的函数是找不着的.
声明的头文件中只有嵌套定义的外层函数,嵌套在函数f中的函数是找不着的。。。
这句话是什么意思啊?
举个例子解释一下
上面例子中,头文件中只有函数f的声明,没有函数g的声明,而在源文件中,函数f实现时要调用g,但g是没有声明的。。。这样解释有点牵强
其实这个限制就是C++的一个规则,它的编译器通不过,但使用gcc貌似就允许嵌套定义,比如下面的程序在gcc下是可以的
int main()
{void print(){cout<<"function defined in main"<<}
print(); return 0;}
为您推荐:
其他类似问题
扫描下载二维码您的举报已经提交成功,我们将尽快处理,谢谢!
C语言中系统只对全局变量自动设定初值0,局部变量中如果没有指定为静态存储类型static,变量的初值就是随机的。
所以在程序中,一般局部变量在应用前都必须设定...
直接#include &#034;###.h&#034;就可以了.在.h中定义了各种类型,常量等,所以一般都是引用.h文件
大家还关注
(window.slotbydup=window.slotbydup || []).push({
id: '2081942',
container: s,
size: '1000,60',
display: 'inlay-fix'

我要回帖

更多关于 三角函数定义 的文章

 

随机推荐