Hello,
I'm a C beginner (actually away for 15 years) and after a bunch of reading I think I have an answer, but would like a confirmation...
In the ESP-IDF example programs, like hello_world, the main functions start with void app_main(), instead of int main(). From what I gather, this is just a choice the Espressif developers made, and could have just as easily used int main(), and a return(0) at the end. Is this correct?
To be clear, I don't mean the difference between the wording "main" and app_main", but the choice to use "void" instead of "int".
If it is a choice, does anyone know why it was made? Google searches find many developers who do not like void main() at all, since they consider it "non-standard".
You're feedback is appreciated.
int main() vs void main() in esp-idf examples
-
- Posts: 27
- Joined: Tue Feb 05, 2019 5:26 pm
Re: int main() vs void main() in esp-idf examples
Sure, I can explain this:
The C standard provides a standard "main routine" form, which is the "int main()" you're referring to.
Microcontroller programs usually also use "int main()" to conform to the standard, even though the main() routine on a microcontroller usually never returns. (Microcontrollers also don't have command line arguments, but you still sometimes see "int main(int argc, char* argv[])" in microcontroller C code, as well.)
(Note that main() is never the *very* first thing that runs in a standard C program - on any OS or on a microcontroller. Some internal startup code - usually provided by the toolchain - runs first and then main() is called.)
If writing standard C, having a "void main()" is a violation of the C standard and may emit a compiler warning. Probably in microcontrollers it doesn't matter at all, because the main() function won't ever return - or if it does return, something bad is going to happen regardless of whether it returns an integer value or not. On a "big" OS, "void main()" is a problem because a program should return an error code when it exits.
ESP-IDF's app_main() is not C standard "main()", which is why it's not called "main()" and doesn't return an integer.
The differences are:
(Aside: there is some discussion thread here about the fact it can be irritating to developers that the ESP32 toolchain doesn't currently provide any way to have a "standard C" startup flow which calls a standard main() function. We plan to fix this limitation eventually, although this won't change anything bout how ESP-IDF apps are written.)
The C standard provides a standard "main routine" form, which is the "int main()" you're referring to.
Microcontroller programs usually also use "int main()" to conform to the standard, even though the main() routine on a microcontroller usually never returns. (Microcontrollers also don't have command line arguments, but you still sometimes see "int main(int argc, char* argv[])" in microcontroller C code, as well.)
(Note that main() is never the *very* first thing that runs in a standard C program - on any OS or on a microcontroller. Some internal startup code - usually provided by the toolchain - runs first and then main() is called.)
If writing standard C, having a "void main()" is a violation of the C standard and may emit a compiler warning. Probably in microcontrollers it doesn't matter at all, because the main() function won't ever return - or if it does return, something bad is going to happen regardless of whether it returns an integer value or not. On a "big" OS, "void main()" is a problem because a program should return an error code when it exits.
ESP-IDF's app_main() is not C standard "main()", which is why it's not called "main()" and doesn't return an integer.
The differences are:
- app_main() is called inside a dedicated FreeRTOS task, after FreeRTOS scheduler is running.
- app_main() can return and ESP-IDF will keep running. This is useful because, for example, you can start some other FreeRTOS tasks from app_main() and then return from app_main().
(Aside: there is some discussion thread here about the fact it can be irritating to developers that the ESP32 toolchain doesn't currently provide any way to have a "standard C" startup flow which calls a standard main() function. We plan to fix this limitation eventually, although this won't change anything bout how ESP-IDF apps are written.)
-
- Posts: 27
- Joined: Tue Feb 05, 2019 5:26 pm
Re: int main() vs void main() in esp-idf examples
Thanks for the answer!
Who is online
Users browsing this forum: No registered users and 138 guests