Does int main() need a declaration on C++?What should main() return in C and C++?How does the main() method work in C?What are the differences between a pointer variable and a reference variable in C++?What does the explicit keyword mean?What should main() return in C and C++?The Definitive C++ Book Guide and ListWhat does if __name__ == “__main__”: do?What is the “-->” operator in C++?Why do we need virtual functions in C++?Easiest way to convert int to string in C++C++11 introduced a standardized memory model. What does it mean? And how is it going to affect C++ programming?What does “Could not find or load main class” mean?

Does the Idaho Potato Commission associate potato skins with healthy eating?

How can saying a song's name be a copyright violation?

Is "remove commented out code" correct English?

Why didn't Miles's spider sense work before?

Forgetting the musical notes while performing in concert

How to show a landlord what we have in savings?

How do I handle a potential work/personal life conflict as the manager of one of my friends?

Detention in 1997

Why do bosons tend to occupy the same state?

How to add frame around section using titlesec?

Unable to supress ligatures in headings which are set in Caps

What do you call someone who asks many questions?

Arrow those variables!

Forming a German sentence with/without the verb at the end

What killed these X2 caps?

Can mass be shunted off into hyperspace, but the matter remains?

How do I gain back my faith in my PhD degree?

Is this a hacking script in function.php?

GFCI outlets - can they be repaired? Are they really needed at the end of a circuit?

What about the virus in 12 Monkeys?

Apex Framework / library for consuming REST services

Why was the shrinking from 8″ made only to 5.25″ and not smaller (4″ or less)?

Avoiding the "not like other girls" trope?

Am I breaking OOP practice with this architecture?



Does int main() need a declaration on C++?


What should main() return in C and C++?How does the main() method work in C?What are the differences between a pointer variable and a reference variable in C++?What does the explicit keyword mean?What should main() return in C and C++?The Definitive C++ Book Guide and ListWhat does if __name__ == “__main__”: do?What is the “-->” operator in C++?Why do we need virtual functions in C++?Easiest way to convert int to string in C++C++11 introduced a standardized memory model. What does it mean? And how is it going to affect C++ programming?What does “Could not find or load main class” mean?













34















When learning functions on C++, I was taught that functions need declarations to be called. For example:



#include <iostream>

int main()
std::cout << "The result is " << sum(1, 2);
return 0;


int sum(int x, int y)
return x + y;



It returns an error, as there is no declaration for the function sum.



main.cpp:4:36: error: use of undeclared identifier 'sum'
std::cout << "The result is " << sum(1, 2);
^
1 error generated.


To fix this, I'd add the declaration:



#include <iostream>

int sum(int x, int y); // declaration

int main()
std::cout << "The result is " << sum(1, 2);
return 0;


int sum(int x, int y)
return x + y;



My question is, why we don't add a declaration for the main function, as we'd have to add for other functions, like sum?










share|improve this question



















  • 16





    Manually calling main invokes undefined behaviour.

    – George
    2 days ago






  • 22





    @MichaelStachowsky -- in C you're allowed to call main. In C++ you aren't; it isn't "just a function" -- it's special. Historically, the reason is that compilers added code to main to initialize global variables that required dynamic initialization; calling main from inside the program would re-initialize those variables, and the result would be chaos.

    – Pete Becker
    2 days ago






  • 25





    @Michael That you've tried something and found that "it works just fine" does not prove that something is not undefined behavior.

    – Cody Gray
    2 days ago






  • 7





    As an aside, you don't need a declaration for sum if you put the definition above main in the file. For this reason, it is common to see main as the last function in C and C++ source code, so you don't need to have forward declarations for other functions defined in that file. Not like C# and Java that often put main first, although it is not required in those cases.

    – Cody
    2 days ago






  • 8





    Technically your example code has declared main, a definition of a function also declares the function. That's why you can move sum before main to avoid having to separately declare sum.

    – Ross Ridge
    2 days ago















34















When learning functions on C++, I was taught that functions need declarations to be called. For example:



#include <iostream>

int main()
std::cout << "The result is " << sum(1, 2);
return 0;


int sum(int x, int y)
return x + y;



It returns an error, as there is no declaration for the function sum.



main.cpp:4:36: error: use of undeclared identifier 'sum'
std::cout << "The result is " << sum(1, 2);
^
1 error generated.


To fix this, I'd add the declaration:



#include <iostream>

int sum(int x, int y); // declaration

int main()
std::cout << "The result is " << sum(1, 2);
return 0;


int sum(int x, int y)
return x + y;



My question is, why we don't add a declaration for the main function, as we'd have to add for other functions, like sum?










share|improve this question



















  • 16





    Manually calling main invokes undefined behaviour.

    – George
    2 days ago






  • 22





    @MichaelStachowsky -- in C you're allowed to call main. In C++ you aren't; it isn't "just a function" -- it's special. Historically, the reason is that compilers added code to main to initialize global variables that required dynamic initialization; calling main from inside the program would re-initialize those variables, and the result would be chaos.

    – Pete Becker
    2 days ago






  • 25





    @Michael That you've tried something and found that "it works just fine" does not prove that something is not undefined behavior.

    – Cody Gray
    2 days ago






  • 7





    As an aside, you don't need a declaration for sum if you put the definition above main in the file. For this reason, it is common to see main as the last function in C and C++ source code, so you don't need to have forward declarations for other functions defined in that file. Not like C# and Java that often put main first, although it is not required in those cases.

    – Cody
    2 days ago






  • 8





    Technically your example code has declared main, a definition of a function also declares the function. That's why you can move sum before main to avoid having to separately declare sum.

    – Ross Ridge
    2 days ago













34












34








34


2






When learning functions on C++, I was taught that functions need declarations to be called. For example:



#include <iostream>

int main()
std::cout << "The result is " << sum(1, 2);
return 0;


int sum(int x, int y)
return x + y;



It returns an error, as there is no declaration for the function sum.



main.cpp:4:36: error: use of undeclared identifier 'sum'
std::cout << "The result is " << sum(1, 2);
^
1 error generated.


To fix this, I'd add the declaration:



#include <iostream>

int sum(int x, int y); // declaration

int main()
std::cout << "The result is " << sum(1, 2);
return 0;


int sum(int x, int y)
return x + y;



My question is, why we don't add a declaration for the main function, as we'd have to add for other functions, like sum?










share|improve this question
















When learning functions on C++, I was taught that functions need declarations to be called. For example:



#include <iostream>

int main()
std::cout << "The result is " << sum(1, 2);
return 0;


int sum(int x, int y)
return x + y;



It returns an error, as there is no declaration for the function sum.



main.cpp:4:36: error: use of undeclared identifier 'sum'
std::cout << "The result is " << sum(1, 2);
^
1 error generated.


To fix this, I'd add the declaration:



#include <iostream>

int sum(int x, int y); // declaration

int main()
std::cout << "The result is " << sum(1, 2);
return 0;


int sum(int x, int y)
return x + y;



My question is, why we don't add a declaration for the main function, as we'd have to add for other functions, like sum?







c++ main forward-declaration function-declaration






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited 2 days ago









NathanOliver

97.9k16138215




97.9k16138215










asked 2 days ago









vnbrsvnbrs

1,52111024




1,52111024







  • 16





    Manually calling main invokes undefined behaviour.

    – George
    2 days ago






  • 22





    @MichaelStachowsky -- in C you're allowed to call main. In C++ you aren't; it isn't "just a function" -- it's special. Historically, the reason is that compilers added code to main to initialize global variables that required dynamic initialization; calling main from inside the program would re-initialize those variables, and the result would be chaos.

    – Pete Becker
    2 days ago






  • 25





    @Michael That you've tried something and found that "it works just fine" does not prove that something is not undefined behavior.

    – Cody Gray
    2 days ago






  • 7





    As an aside, you don't need a declaration for sum if you put the definition above main in the file. For this reason, it is common to see main as the last function in C and C++ source code, so you don't need to have forward declarations for other functions defined in that file. Not like C# and Java that often put main first, although it is not required in those cases.

    – Cody
    2 days ago






  • 8





    Technically your example code has declared main, a definition of a function also declares the function. That's why you can move sum before main to avoid having to separately declare sum.

    – Ross Ridge
    2 days ago












  • 16





    Manually calling main invokes undefined behaviour.

    – George
    2 days ago






  • 22





    @MichaelStachowsky -- in C you're allowed to call main. In C++ you aren't; it isn't "just a function" -- it's special. Historically, the reason is that compilers added code to main to initialize global variables that required dynamic initialization; calling main from inside the program would re-initialize those variables, and the result would be chaos.

    – Pete Becker
    2 days ago






  • 25





    @Michael That you've tried something and found that "it works just fine" does not prove that something is not undefined behavior.

    – Cody Gray
    2 days ago






  • 7





    As an aside, you don't need a declaration for sum if you put the definition above main in the file. For this reason, it is common to see main as the last function in C and C++ source code, so you don't need to have forward declarations for other functions defined in that file. Not like C# and Java that often put main first, although it is not required in those cases.

    – Cody
    2 days ago






  • 8





    Technically your example code has declared main, a definition of a function also declares the function. That's why you can move sum before main to avoid having to separately declare sum.

    – Ross Ridge
    2 days ago







16




16





Manually calling main invokes undefined behaviour.

– George
2 days ago





Manually calling main invokes undefined behaviour.

– George
2 days ago




22




22





@MichaelStachowsky -- in C you're allowed to call main. In C++ you aren't; it isn't "just a function" -- it's special. Historically, the reason is that compilers added code to main to initialize global variables that required dynamic initialization; calling main from inside the program would re-initialize those variables, and the result would be chaos.

– Pete Becker
2 days ago





@MichaelStachowsky -- in C you're allowed to call main. In C++ you aren't; it isn't "just a function" -- it's special. Historically, the reason is that compilers added code to main to initialize global variables that required dynamic initialization; calling main from inside the program would re-initialize those variables, and the result would be chaos.

– Pete Becker
2 days ago




25




25





@Michael That you've tried something and found that "it works just fine" does not prove that something is not undefined behavior.

– Cody Gray
2 days ago





@Michael That you've tried something and found that "it works just fine" does not prove that something is not undefined behavior.

– Cody Gray
2 days ago




7




7





As an aside, you don't need a declaration for sum if you put the definition above main in the file. For this reason, it is common to see main as the last function in C and C++ source code, so you don't need to have forward declarations for other functions defined in that file. Not like C# and Java that often put main first, although it is not required in those cases.

– Cody
2 days ago





As an aside, you don't need a declaration for sum if you put the definition above main in the file. For this reason, it is common to see main as the last function in C and C++ source code, so you don't need to have forward declarations for other functions defined in that file. Not like C# and Java that often put main first, although it is not required in those cases.

– Cody
2 days ago




8




8





Technically your example code has declared main, a definition of a function also declares the function. That's why you can move sum before main to avoid having to separately declare sum.

– Ross Ridge
2 days ago





Technically your example code has declared main, a definition of a function also declares the function. That's why you can move sum before main to avoid having to separately declare sum.

– Ross Ridge
2 days ago












7 Answers
7






active

oldest

votes


















38














A definition of a function is also a declaration of a function.



The purpose of a declaring a function is to make it known to the compiler. Declaring a function without defining it allows a function to be used in places where it is inconvenient to define it. For example:



  • If a function is used in a source file (A) other than the one it is defined in (B), we need to declare it in A (usually via a header that A includes, such as B.h).

  • If two or more functions may call each other, then we cannot define all those functions before the others—one of them has to be first. So declarations can be provided first, with definitions coming afterward.

  • Many people prefer to put “higher level” routines earlier in a source file and subroutines later. Since those “higher level” routines call various subroutines, the subroutines must be declared earlier.

In C++, a user program never calls main, so it never needs a declaration before the definition. (Note that you could provide one if you wished. There is nothing special about a declaration of main in this regard.) In C, a program can call main. In that case, it does require that a declaration be visible before the call.



Note that main does need to be known to the code that calls it. This is special code in what is typically called the C++ runtime startup code. The linker includes that code for you automatically when you are linking a C++ program with the appropriate linker options. Whatever language that code is written in, it has whatever declaration of main it needs in order to call it properly.






share|improve this answer























  • I think this is the most complete and correct answer so far. It's a pitty it won't get more popular because of the abundance of text. Could you add some tl;dr at the beginning? Also, I think, that it might not be obvious that the C++ compilers parse the code in such a sequential manner. Other languages overcome this issue by scanning declarations first and definitions later. C++ overcomes it only for class bodies.

    – pkubik
    yesterday











  • Thank you for this! Indeed the most complete one. I can now understand this a bit more.

    – vnbrs
    yesterday



















36















I was taught that functions need declarations to be called.




Indeed. A function must be declared before it can be called.




why we don't add a declaration for the main function?




Well, you didn't call main function. In fact, you must not call main at all1, so there is never a need to declare main before anything.



Technically though, all definitions are also declarations, so your definition of main also declares main.




Footnote 1: The C++ standard says it's undefined behaviour to call main from within the program.



This allows C++ implementations to put special run-once startup code at the top of main, if they aren't able to have it run earlier from hooks in the startup code that normally calls main. Some real implementations do in fact do this, e.g. calling a fast-math function that sets some FPU flags like denormals-are-zero.



On a hypothetical implementation, calling main could result in fun things like re-running constructors for all static variables, re-initializing the data structures used by new/delete to keep track of allocations, or other total breakage of your program. Or it might not cause any problem at all. Undefined behaviour doesn't mean it has to fail on every implementation.






share|improve this answer
































    34














    The prototype is required if you want to call the function, but it's not yet available, like sum in your case.



    You must not call main yourself, so there is no need to have a prototype. It's even a bad a idea to write a prototype.






    share|improve this answer

























    • It is not a "bad idea" at all to call main. C allows it; C++ makes it undefined for reasons which have nothing to do with it being a bad idea.

      – Kaz
      yesterday






    • 9





      @Kaz It's a bad idea to do something whose behaviour is undefined.

      – eerorika
      yesterday











    • @eeroika That's a circular argument. Recursive main that was well-defined came first. The answer says that not only must you not do this, but it's even a bad idea.That implies that it's a bad idea for additional reasons other than it being prohibited, or perhaps that it's prohibited due to being a bad idea, which is not so. This is just a feature of C that the C++ dialect fails to implement.

      – Kaz
      yesterday






    • 1





      A C++ compiler is allowed to emit the translated image main as if it were extern "C" linkage. Or to substitute a different symbol for its name entirely, like __main or whatever. Yet, it's also allowed to ignore these considerations when compiling main, and treat it just as another function, so that the main symbol is declared in the ordinary way. The recursive call to main may expect to be calling a C++ function called main with ordinary C++ linkage, that supports overloading and all, yet there need not be such a symbol at all in the translation due to the special treatment.

      – Kaz
      yesterday






    • 1





      @MatthieuBrucher Ah, OK; I misread that. The prototype could serve no useful purpose in C++.

      – Kaz
      yesterday


















    25














    No, the compiler does not need a forward declaration for main().



    main() is a special function in C++.



    Some important things to remember about main() are:



    1. The linker requires that one and only one main() function exist when creating an executable program.

    2. The compiler expects a main() function in one of the following two forms:

    int main () /* body */ 
    int main (int argc, char *argv[]) /* body */


    where body is zero or more statements



    An additional acceptable form is implementation specific and provides a list of the environment variables at the time the function is called:



    int main (int argc, char* argv[], char *envp[]) /* body */ 


    The coder must provide the 'definition' of main using one of these acceptable forms, but the coder does not need to provide a declaration. The coded definiton is accepted by the compiler as the declaration of main().



    1. If no return statement is provided, the compiler will provide a return 0; as the last statement in the function body.

    As an aside, there is sometimes confusion about whether a C++ program can make a call to main(). This is not recommended. The C++17 draft states that main() "shall not be used within a program." In other words, cannot be called from within a program. See e.g. Working Draft Standard for C++ Programming Language, dated "2017-03-21", Paragraph 6.6.1.3, page 66. I realize that some compilers support this (including mine), but the next version of the compiler could modify or remove that behavior as the standard uses the term "shall not".






    share|improve this answer

























    • Also note that the standard allows other implementation-defined signatures for main besides the two you listed here. A common option is to add a 3rd argument (after argv) that contains the environment variables (using the same method as extern char** environ)

      – SJL
      2 days ago











    • @SJL: Absolutely! I have only listed the ones that "must" be implemented by the compiler. The environ is also very helpful.

      – Gardener
      2 days ago






    • 8





      "compiler does not need a declaration for main()" Every definition is a declaration, so I think the wording needs to be adjusted. "compiler declares it as one of the following two functions" Why "compiler declares"? We always provide a definition for main ourselves.

      – HolyBlackCat
      2 days ago







    • 1





      @HolyBlackCat: I see your point. Wording is important. Even if I change it, without quoting the entire standard, there will not be a complete answer. The answer is meant to be simple. See what you think of this update.

      – Gardener
      2 days ago






    • 6





      There's nothing special about the main function with regards to (forward) declaration. That's simply a red herring. Rather, we don't need to forward declare it since we're not referring to it before its definition. That's all.

      – Konrad Rudolph
      yesterday


















    10














    It is illegal to call main from inside your program. That means the only thing that is going to call it is the runtime and the compiler/linker can handle setting that up.This means you do not need a prototype for main.






    share|improve this answer






























      7














      A definition of a function also implicitly declares it. If you need to reference a function before it is defined you need to declare it before you use it.



      So writing the following is also valid:



      int sum(int x, int y) 
      return x + y;


      int main()
      std::cout << "The result is " << sum(1, 2);
      return 0;



      If you use a declaration in one file to make a function known to the compiler before it is defined, then its definition has to be known at linking time:



      main.cpp



      int sum(int x, int y);

      int main()
      std::cout << "The result is " << sum(1, 2);
      return 0;



      sum.cpp



      int sum(int x, int y) 
      return x + y;



      Or sum could have its origin in a library, so you do not even compile it yourself.



      The main function is not used/referenced in your code anywhere, so there is no need to add the declaration of main anywhere.



      Before and after your main function the c++ library might execute some init and cleanup steps, and will call your main function. If that part of the library would be represented as c++ code then it would contain a declaration of int main() so that that it could be compiled. That code could look like this:



      int main();

      int __main()
      __startup_runtime();

      main();

      __cleanup_runtime();



      But then you again have the same problem with __main so at some point there is no c++ anymore and a certain function (main) just represents the entry point of your code.






      share|improve this answer

























      • C++ makes it UB to call main from inside the program, so C++ compilers can put those startup/cleanup calls right into the real main if they want. This rule lets C++ compilers work on top of C environments, for example, giving somewhere for static constructors to be called from if there's no other mechanism a compiler can use. (Compilers also have to recognize main as a special function name to give it an implicit return 0.)

        – Peter Cordes
        yesterday











      • @PeterCordes from the perspective of the programmer it is UB to call the main function due to the the standard. But how the compile vendors or the os handles main is implementation dependent. So in theory the compiled result of the main could look like a regular function that is called by the run-time, or it could not exists and as you said, the compilers can put those startup/cleanup calls right at the entry point of the application around the code that is shown in the main.

        – t.niese
        yesterday











      • Yup, in most implementations it is just a normal function (but with an implicit extern "C" to not do C++ name mangling on it, so the CRT startup code can link to it regardless of function signature), with real init work done in CRT code and/or from dynamic linker hooks. But like I commented Joshua's answer, ICC (Intel's compiler) does in fact add some startup code inside main itself (godbolt.org/z/oWlmlc), including setting DAZ and FTZ to disable subnormals for its default of -ffast-math. gcc/clang link different CRT startup files for fast-math or not.

        – Peter Cordes
        yesterday


















      5














      Nope. You can't call it anyway.



      You only need forward declarations for functions called before they are defined. You need external declarations (which look exactly like forward declarations on purpose) for functions defined in other files.



      But you can't call main in C++ so you don't need one. This is because the C++ compiler is allowed to modify main to do global initialization.



      [I looked at crt0.c and it does have a declaration for main but that's neither here nor there].






      share|improve this answer

























      • You can call main, it's just typically bad practice.

        – Cruz Jean
        2 days ago






      • 8





        @CruzJean not just a bad practice, it's undefined behavior as far as I know

        – Guillaume Racicot
        2 days ago






      • 5





        @CruzJean Not bad practice. Calling it invokes undefined behavior.

        – Algirdas Preidžius
        2 days ago











      • @AlgirdasPreidžius Ah, I stand corrected. Never knew about that.

        – Cruz Jean
        2 days ago











      • This is because the C++ compiler is allowed to modify main to do global initialization. Is it? I can't see how that would even work as you would be assigning in main which can change the observable effects of the program.

        – NathanOliver
        2 days ago











      Your Answer






      StackExchange.ifUsing("editor", function ()
      StackExchange.using("externalEditor", function ()
      StackExchange.using("snippets", function ()
      StackExchange.snippets.init();
      );
      );
      , "code-snippets");

      StackExchange.ready(function()
      var channelOptions =
      tags: "".split(" "),
      id: "1"
      ;
      initTagRenderer("".split(" "), "".split(" "), channelOptions);

      StackExchange.using("externalEditor", function()
      // Have to fire editor after snippets, if snippets enabled
      if (StackExchange.settings.snippets.snippetsEnabled)
      StackExchange.using("snippets", function()
      createEditor();
      );

      else
      createEditor();

      );

      function createEditor()
      StackExchange.prepareEditor(
      heartbeatType: 'answer',
      autoActivateHeartbeat: false,
      convertImagesToLinks: true,
      noModals: true,
      showLowRepImageUploadWarning: true,
      reputationToPostImages: 10,
      bindNavPrevention: true,
      postfix: "",
      imageUploader:
      brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
      contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
      allowUrls: true
      ,
      onDemand: true,
      discardSelector: ".discard-answer"
      ,immediatelyShowMarkdownHelp:true
      );



      );













      draft saved

      draft discarded


















      StackExchange.ready(
      function ()
      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55457704%2fdoes-int-main-need-a-declaration-on-c%23new-answer', 'question_page');

      );

      Post as a guest















      Required, but never shown

























      7 Answers
      7






      active

      oldest

      votes








      7 Answers
      7






      active

      oldest

      votes









      active

      oldest

      votes






      active

      oldest

      votes









      38














      A definition of a function is also a declaration of a function.



      The purpose of a declaring a function is to make it known to the compiler. Declaring a function without defining it allows a function to be used in places where it is inconvenient to define it. For example:



      • If a function is used in a source file (A) other than the one it is defined in (B), we need to declare it in A (usually via a header that A includes, such as B.h).

      • If two or more functions may call each other, then we cannot define all those functions before the others—one of them has to be first. So declarations can be provided first, with definitions coming afterward.

      • Many people prefer to put “higher level” routines earlier in a source file and subroutines later. Since those “higher level” routines call various subroutines, the subroutines must be declared earlier.

      In C++, a user program never calls main, so it never needs a declaration before the definition. (Note that you could provide one if you wished. There is nothing special about a declaration of main in this regard.) In C, a program can call main. In that case, it does require that a declaration be visible before the call.



      Note that main does need to be known to the code that calls it. This is special code in what is typically called the C++ runtime startup code. The linker includes that code for you automatically when you are linking a C++ program with the appropriate linker options. Whatever language that code is written in, it has whatever declaration of main it needs in order to call it properly.






      share|improve this answer























      • I think this is the most complete and correct answer so far. It's a pitty it won't get more popular because of the abundance of text. Could you add some tl;dr at the beginning? Also, I think, that it might not be obvious that the C++ compilers parse the code in such a sequential manner. Other languages overcome this issue by scanning declarations first and definitions later. C++ overcomes it only for class bodies.

        – pkubik
        yesterday











      • Thank you for this! Indeed the most complete one. I can now understand this a bit more.

        – vnbrs
        yesterday
















      38














      A definition of a function is also a declaration of a function.



      The purpose of a declaring a function is to make it known to the compiler. Declaring a function without defining it allows a function to be used in places where it is inconvenient to define it. For example:



      • If a function is used in a source file (A) other than the one it is defined in (B), we need to declare it in A (usually via a header that A includes, such as B.h).

      • If two or more functions may call each other, then we cannot define all those functions before the others—one of them has to be first. So declarations can be provided first, with definitions coming afterward.

      • Many people prefer to put “higher level” routines earlier in a source file and subroutines later. Since those “higher level” routines call various subroutines, the subroutines must be declared earlier.

      In C++, a user program never calls main, so it never needs a declaration before the definition. (Note that you could provide one if you wished. There is nothing special about a declaration of main in this regard.) In C, a program can call main. In that case, it does require that a declaration be visible before the call.



      Note that main does need to be known to the code that calls it. This is special code in what is typically called the C++ runtime startup code. The linker includes that code for you automatically when you are linking a C++ program with the appropriate linker options. Whatever language that code is written in, it has whatever declaration of main it needs in order to call it properly.






      share|improve this answer























      • I think this is the most complete and correct answer so far. It's a pitty it won't get more popular because of the abundance of text. Could you add some tl;dr at the beginning? Also, I think, that it might not be obvious that the C++ compilers parse the code in such a sequential manner. Other languages overcome this issue by scanning declarations first and definitions later. C++ overcomes it only for class bodies.

        – pkubik
        yesterday











      • Thank you for this! Indeed the most complete one. I can now understand this a bit more.

        – vnbrs
        yesterday














      38












      38








      38







      A definition of a function is also a declaration of a function.



      The purpose of a declaring a function is to make it known to the compiler. Declaring a function without defining it allows a function to be used in places where it is inconvenient to define it. For example:



      • If a function is used in a source file (A) other than the one it is defined in (B), we need to declare it in A (usually via a header that A includes, such as B.h).

      • If two or more functions may call each other, then we cannot define all those functions before the others—one of them has to be first. So declarations can be provided first, with definitions coming afterward.

      • Many people prefer to put “higher level” routines earlier in a source file and subroutines later. Since those “higher level” routines call various subroutines, the subroutines must be declared earlier.

      In C++, a user program never calls main, so it never needs a declaration before the definition. (Note that you could provide one if you wished. There is nothing special about a declaration of main in this regard.) In C, a program can call main. In that case, it does require that a declaration be visible before the call.



      Note that main does need to be known to the code that calls it. This is special code in what is typically called the C++ runtime startup code. The linker includes that code for you automatically when you are linking a C++ program with the appropriate linker options. Whatever language that code is written in, it has whatever declaration of main it needs in order to call it properly.






      share|improve this answer













      A definition of a function is also a declaration of a function.



      The purpose of a declaring a function is to make it known to the compiler. Declaring a function without defining it allows a function to be used in places where it is inconvenient to define it. For example:



      • If a function is used in a source file (A) other than the one it is defined in (B), we need to declare it in A (usually via a header that A includes, such as B.h).

      • If two or more functions may call each other, then we cannot define all those functions before the others—one of them has to be first. So declarations can be provided first, with definitions coming afterward.

      • Many people prefer to put “higher level” routines earlier in a source file and subroutines later. Since those “higher level” routines call various subroutines, the subroutines must be declared earlier.

      In C++, a user program never calls main, so it never needs a declaration before the definition. (Note that you could provide one if you wished. There is nothing special about a declaration of main in this regard.) In C, a program can call main. In that case, it does require that a declaration be visible before the call.



      Note that main does need to be known to the code that calls it. This is special code in what is typically called the C++ runtime startup code. The linker includes that code for you automatically when you are linking a C++ program with the appropriate linker options. Whatever language that code is written in, it has whatever declaration of main it needs in order to call it properly.







      share|improve this answer












      share|improve this answer



      share|improve this answer










      answered 2 days ago









      Eric PostpischilEric Postpischil

      80k889169




      80k889169












      • I think this is the most complete and correct answer so far. It's a pitty it won't get more popular because of the abundance of text. Could you add some tl;dr at the beginning? Also, I think, that it might not be obvious that the C++ compilers parse the code in such a sequential manner. Other languages overcome this issue by scanning declarations first and definitions later. C++ overcomes it only for class bodies.

        – pkubik
        yesterday











      • Thank you for this! Indeed the most complete one. I can now understand this a bit more.

        – vnbrs
        yesterday


















      • I think this is the most complete and correct answer so far. It's a pitty it won't get more popular because of the abundance of text. Could you add some tl;dr at the beginning? Also, I think, that it might not be obvious that the C++ compilers parse the code in such a sequential manner. Other languages overcome this issue by scanning declarations first and definitions later. C++ overcomes it only for class bodies.

        – pkubik
        yesterday











      • Thank you for this! Indeed the most complete one. I can now understand this a bit more.

        – vnbrs
        yesterday

















      I think this is the most complete and correct answer so far. It's a pitty it won't get more popular because of the abundance of text. Could you add some tl;dr at the beginning? Also, I think, that it might not be obvious that the C++ compilers parse the code in such a sequential manner. Other languages overcome this issue by scanning declarations first and definitions later. C++ overcomes it only for class bodies.

      – pkubik
      yesterday





      I think this is the most complete and correct answer so far. It's a pitty it won't get more popular because of the abundance of text. Could you add some tl;dr at the beginning? Also, I think, that it might not be obvious that the C++ compilers parse the code in such a sequential manner. Other languages overcome this issue by scanning declarations first and definitions later. C++ overcomes it only for class bodies.

      – pkubik
      yesterday













      Thank you for this! Indeed the most complete one. I can now understand this a bit more.

      – vnbrs
      yesterday






      Thank you for this! Indeed the most complete one. I can now understand this a bit more.

      – vnbrs
      yesterday














      36















      I was taught that functions need declarations to be called.




      Indeed. A function must be declared before it can be called.




      why we don't add a declaration for the main function?




      Well, you didn't call main function. In fact, you must not call main at all1, so there is never a need to declare main before anything.



      Technically though, all definitions are also declarations, so your definition of main also declares main.




      Footnote 1: The C++ standard says it's undefined behaviour to call main from within the program.



      This allows C++ implementations to put special run-once startup code at the top of main, if they aren't able to have it run earlier from hooks in the startup code that normally calls main. Some real implementations do in fact do this, e.g. calling a fast-math function that sets some FPU flags like denormals-are-zero.



      On a hypothetical implementation, calling main could result in fun things like re-running constructors for all static variables, re-initializing the data structures used by new/delete to keep track of allocations, or other total breakage of your program. Or it might not cause any problem at all. Undefined behaviour doesn't mean it has to fail on every implementation.






      share|improve this answer





























        36















        I was taught that functions need declarations to be called.




        Indeed. A function must be declared before it can be called.




        why we don't add a declaration for the main function?




        Well, you didn't call main function. In fact, you must not call main at all1, so there is never a need to declare main before anything.



        Technically though, all definitions are also declarations, so your definition of main also declares main.




        Footnote 1: The C++ standard says it's undefined behaviour to call main from within the program.



        This allows C++ implementations to put special run-once startup code at the top of main, if they aren't able to have it run earlier from hooks in the startup code that normally calls main. Some real implementations do in fact do this, e.g. calling a fast-math function that sets some FPU flags like denormals-are-zero.



        On a hypothetical implementation, calling main could result in fun things like re-running constructors for all static variables, re-initializing the data structures used by new/delete to keep track of allocations, or other total breakage of your program. Or it might not cause any problem at all. Undefined behaviour doesn't mean it has to fail on every implementation.






        share|improve this answer



























          36












          36








          36








          I was taught that functions need declarations to be called.




          Indeed. A function must be declared before it can be called.




          why we don't add a declaration for the main function?




          Well, you didn't call main function. In fact, you must not call main at all1, so there is never a need to declare main before anything.



          Technically though, all definitions are also declarations, so your definition of main also declares main.




          Footnote 1: The C++ standard says it's undefined behaviour to call main from within the program.



          This allows C++ implementations to put special run-once startup code at the top of main, if they aren't able to have it run earlier from hooks in the startup code that normally calls main. Some real implementations do in fact do this, e.g. calling a fast-math function that sets some FPU flags like denormals-are-zero.



          On a hypothetical implementation, calling main could result in fun things like re-running constructors for all static variables, re-initializing the data structures used by new/delete to keep track of allocations, or other total breakage of your program. Or it might not cause any problem at all. Undefined behaviour doesn't mean it has to fail on every implementation.






          share|improve this answer
















          I was taught that functions need declarations to be called.




          Indeed. A function must be declared before it can be called.




          why we don't add a declaration for the main function?




          Well, you didn't call main function. In fact, you must not call main at all1, so there is never a need to declare main before anything.



          Technically though, all definitions are also declarations, so your definition of main also declares main.




          Footnote 1: The C++ standard says it's undefined behaviour to call main from within the program.



          This allows C++ implementations to put special run-once startup code at the top of main, if they aren't able to have it run earlier from hooks in the startup code that normally calls main. Some real implementations do in fact do this, e.g. calling a fast-math function that sets some FPU flags like denormals-are-zero.



          On a hypothetical implementation, calling main could result in fun things like re-running constructors for all static variables, re-initializing the data structures used by new/delete to keep track of allocations, or other total breakage of your program. Or it might not cause any problem at all. Undefined behaviour doesn't mean it has to fail on every implementation.







          share|improve this answer














          share|improve this answer



          share|improve this answer








          edited yesterday









          Peter Cordes

          133k18203341




          133k18203341










          answered 2 days ago









          eerorikaeerorika

          89k664136




          89k664136





















              34














              The prototype is required if you want to call the function, but it's not yet available, like sum in your case.



              You must not call main yourself, so there is no need to have a prototype. It's even a bad a idea to write a prototype.






              share|improve this answer

























              • It is not a "bad idea" at all to call main. C allows it; C++ makes it undefined for reasons which have nothing to do with it being a bad idea.

                – Kaz
                yesterday






              • 9





                @Kaz It's a bad idea to do something whose behaviour is undefined.

                – eerorika
                yesterday











              • @eeroika That's a circular argument. Recursive main that was well-defined came first. The answer says that not only must you not do this, but it's even a bad idea.That implies that it's a bad idea for additional reasons other than it being prohibited, or perhaps that it's prohibited due to being a bad idea, which is not so. This is just a feature of C that the C++ dialect fails to implement.

                – Kaz
                yesterday






              • 1





                A C++ compiler is allowed to emit the translated image main as if it were extern "C" linkage. Or to substitute a different symbol for its name entirely, like __main or whatever. Yet, it's also allowed to ignore these considerations when compiling main, and treat it just as another function, so that the main symbol is declared in the ordinary way. The recursive call to main may expect to be calling a C++ function called main with ordinary C++ linkage, that supports overloading and all, yet there need not be such a symbol at all in the translation due to the special treatment.

                – Kaz
                yesterday






              • 1





                @MatthieuBrucher Ah, OK; I misread that. The prototype could serve no useful purpose in C++.

                – Kaz
                yesterday















              34














              The prototype is required if you want to call the function, but it's not yet available, like sum in your case.



              You must not call main yourself, so there is no need to have a prototype. It's even a bad a idea to write a prototype.






              share|improve this answer

























              • It is not a "bad idea" at all to call main. C allows it; C++ makes it undefined for reasons which have nothing to do with it being a bad idea.

                – Kaz
                yesterday






              • 9





                @Kaz It's a bad idea to do something whose behaviour is undefined.

                – eerorika
                yesterday











              • @eeroika That's a circular argument. Recursive main that was well-defined came first. The answer says that not only must you not do this, but it's even a bad idea.That implies that it's a bad idea for additional reasons other than it being prohibited, or perhaps that it's prohibited due to being a bad idea, which is not so. This is just a feature of C that the C++ dialect fails to implement.

                – Kaz
                yesterday






              • 1





                A C++ compiler is allowed to emit the translated image main as if it were extern "C" linkage. Or to substitute a different symbol for its name entirely, like __main or whatever. Yet, it's also allowed to ignore these considerations when compiling main, and treat it just as another function, so that the main symbol is declared in the ordinary way. The recursive call to main may expect to be calling a C++ function called main with ordinary C++ linkage, that supports overloading and all, yet there need not be such a symbol at all in the translation due to the special treatment.

                – Kaz
                yesterday






              • 1





                @MatthieuBrucher Ah, OK; I misread that. The prototype could serve no useful purpose in C++.

                – Kaz
                yesterday













              34












              34








              34







              The prototype is required if you want to call the function, but it's not yet available, like sum in your case.



              You must not call main yourself, so there is no need to have a prototype. It's even a bad a idea to write a prototype.






              share|improve this answer















              The prototype is required if you want to call the function, but it's not yet available, like sum in your case.



              You must not call main yourself, so there is no need to have a prototype. It's even a bad a idea to write a prototype.







              share|improve this answer














              share|improve this answer



              share|improve this answer








              edited yesterday

























              answered 2 days ago









              Matthieu BrucherMatthieu Brucher

              17.4k42345




              17.4k42345












              • It is not a "bad idea" at all to call main. C allows it; C++ makes it undefined for reasons which have nothing to do with it being a bad idea.

                – Kaz
                yesterday






              • 9





                @Kaz It's a bad idea to do something whose behaviour is undefined.

                – eerorika
                yesterday











              • @eeroika That's a circular argument. Recursive main that was well-defined came first. The answer says that not only must you not do this, but it's even a bad idea.That implies that it's a bad idea for additional reasons other than it being prohibited, or perhaps that it's prohibited due to being a bad idea, which is not so. This is just a feature of C that the C++ dialect fails to implement.

                – Kaz
                yesterday






              • 1





                A C++ compiler is allowed to emit the translated image main as if it were extern "C" linkage. Or to substitute a different symbol for its name entirely, like __main or whatever. Yet, it's also allowed to ignore these considerations when compiling main, and treat it just as another function, so that the main symbol is declared in the ordinary way. The recursive call to main may expect to be calling a C++ function called main with ordinary C++ linkage, that supports overloading and all, yet there need not be such a symbol at all in the translation due to the special treatment.

                – Kaz
                yesterday






              • 1





                @MatthieuBrucher Ah, OK; I misread that. The prototype could serve no useful purpose in C++.

                – Kaz
                yesterday

















              • It is not a "bad idea" at all to call main. C allows it; C++ makes it undefined for reasons which have nothing to do with it being a bad idea.

                – Kaz
                yesterday






              • 9





                @Kaz It's a bad idea to do something whose behaviour is undefined.

                – eerorika
                yesterday











              • @eeroika That's a circular argument. Recursive main that was well-defined came first. The answer says that not only must you not do this, but it's even a bad idea.That implies that it's a bad idea for additional reasons other than it being prohibited, or perhaps that it's prohibited due to being a bad idea, which is not so. This is just a feature of C that the C++ dialect fails to implement.

                – Kaz
                yesterday






              • 1





                A C++ compiler is allowed to emit the translated image main as if it were extern "C" linkage. Or to substitute a different symbol for its name entirely, like __main or whatever. Yet, it's also allowed to ignore these considerations when compiling main, and treat it just as another function, so that the main symbol is declared in the ordinary way. The recursive call to main may expect to be calling a C++ function called main with ordinary C++ linkage, that supports overloading and all, yet there need not be such a symbol at all in the translation due to the special treatment.

                – Kaz
                yesterday






              • 1





                @MatthieuBrucher Ah, OK; I misread that. The prototype could serve no useful purpose in C++.

                – Kaz
                yesterday
















              It is not a "bad idea" at all to call main. C allows it; C++ makes it undefined for reasons which have nothing to do with it being a bad idea.

              – Kaz
              yesterday





              It is not a "bad idea" at all to call main. C allows it; C++ makes it undefined for reasons which have nothing to do with it being a bad idea.

              – Kaz
              yesterday




              9




              9





              @Kaz It's a bad idea to do something whose behaviour is undefined.

              – eerorika
              yesterday





              @Kaz It's a bad idea to do something whose behaviour is undefined.

              – eerorika
              yesterday













              @eeroika That's a circular argument. Recursive main that was well-defined came first. The answer says that not only must you not do this, but it's even a bad idea.That implies that it's a bad idea for additional reasons other than it being prohibited, or perhaps that it's prohibited due to being a bad idea, which is not so. This is just a feature of C that the C++ dialect fails to implement.

              – Kaz
              yesterday





              @eeroika That's a circular argument. Recursive main that was well-defined came first. The answer says that not only must you not do this, but it's even a bad idea.That implies that it's a bad idea for additional reasons other than it being prohibited, or perhaps that it's prohibited due to being a bad idea, which is not so. This is just a feature of C that the C++ dialect fails to implement.

              – Kaz
              yesterday




              1




              1





              A C++ compiler is allowed to emit the translated image main as if it were extern "C" linkage. Or to substitute a different symbol for its name entirely, like __main or whatever. Yet, it's also allowed to ignore these considerations when compiling main, and treat it just as another function, so that the main symbol is declared in the ordinary way. The recursive call to main may expect to be calling a C++ function called main with ordinary C++ linkage, that supports overloading and all, yet there need not be such a symbol at all in the translation due to the special treatment.

              – Kaz
              yesterday





              A C++ compiler is allowed to emit the translated image main as if it were extern "C" linkage. Or to substitute a different symbol for its name entirely, like __main or whatever. Yet, it's also allowed to ignore these considerations when compiling main, and treat it just as another function, so that the main symbol is declared in the ordinary way. The recursive call to main may expect to be calling a C++ function called main with ordinary C++ linkage, that supports overloading and all, yet there need not be such a symbol at all in the translation due to the special treatment.

              – Kaz
              yesterday




              1




              1





              @MatthieuBrucher Ah, OK; I misread that. The prototype could serve no useful purpose in C++.

              – Kaz
              yesterday





              @MatthieuBrucher Ah, OK; I misread that. The prototype could serve no useful purpose in C++.

              – Kaz
              yesterday











              25














              No, the compiler does not need a forward declaration for main().



              main() is a special function in C++.



              Some important things to remember about main() are:



              1. The linker requires that one and only one main() function exist when creating an executable program.

              2. The compiler expects a main() function in one of the following two forms:

              int main () /* body */ 
              int main (int argc, char *argv[]) /* body */


              where body is zero or more statements



              An additional acceptable form is implementation specific and provides a list of the environment variables at the time the function is called:



              int main (int argc, char* argv[], char *envp[]) /* body */ 


              The coder must provide the 'definition' of main using one of these acceptable forms, but the coder does not need to provide a declaration. The coded definiton is accepted by the compiler as the declaration of main().



              1. If no return statement is provided, the compiler will provide a return 0; as the last statement in the function body.

              As an aside, there is sometimes confusion about whether a C++ program can make a call to main(). This is not recommended. The C++17 draft states that main() "shall not be used within a program." In other words, cannot be called from within a program. See e.g. Working Draft Standard for C++ Programming Language, dated "2017-03-21", Paragraph 6.6.1.3, page 66. I realize that some compilers support this (including mine), but the next version of the compiler could modify or remove that behavior as the standard uses the term "shall not".






              share|improve this answer

























              • Also note that the standard allows other implementation-defined signatures for main besides the two you listed here. A common option is to add a 3rd argument (after argv) that contains the environment variables (using the same method as extern char** environ)

                – SJL
                2 days ago











              • @SJL: Absolutely! I have only listed the ones that "must" be implemented by the compiler. The environ is also very helpful.

                – Gardener
                2 days ago






              • 8





                "compiler does not need a declaration for main()" Every definition is a declaration, so I think the wording needs to be adjusted. "compiler declares it as one of the following two functions" Why "compiler declares"? We always provide a definition for main ourselves.

                – HolyBlackCat
                2 days ago







              • 1





                @HolyBlackCat: I see your point. Wording is important. Even if I change it, without quoting the entire standard, there will not be a complete answer. The answer is meant to be simple. See what you think of this update.

                – Gardener
                2 days ago






              • 6





                There's nothing special about the main function with regards to (forward) declaration. That's simply a red herring. Rather, we don't need to forward declare it since we're not referring to it before its definition. That's all.

                – Konrad Rudolph
                yesterday















              25














              No, the compiler does not need a forward declaration for main().



              main() is a special function in C++.



              Some important things to remember about main() are:



              1. The linker requires that one and only one main() function exist when creating an executable program.

              2. The compiler expects a main() function in one of the following two forms:

              int main () /* body */ 
              int main (int argc, char *argv[]) /* body */


              where body is zero or more statements



              An additional acceptable form is implementation specific and provides a list of the environment variables at the time the function is called:



              int main (int argc, char* argv[], char *envp[]) /* body */ 


              The coder must provide the 'definition' of main using one of these acceptable forms, but the coder does not need to provide a declaration. The coded definiton is accepted by the compiler as the declaration of main().



              1. If no return statement is provided, the compiler will provide a return 0; as the last statement in the function body.

              As an aside, there is sometimes confusion about whether a C++ program can make a call to main(). This is not recommended. The C++17 draft states that main() "shall not be used within a program." In other words, cannot be called from within a program. See e.g. Working Draft Standard for C++ Programming Language, dated "2017-03-21", Paragraph 6.6.1.3, page 66. I realize that some compilers support this (including mine), but the next version of the compiler could modify or remove that behavior as the standard uses the term "shall not".






              share|improve this answer

























              • Also note that the standard allows other implementation-defined signatures for main besides the two you listed here. A common option is to add a 3rd argument (after argv) that contains the environment variables (using the same method as extern char** environ)

                – SJL
                2 days ago











              • @SJL: Absolutely! I have only listed the ones that "must" be implemented by the compiler. The environ is also very helpful.

                – Gardener
                2 days ago






              • 8





                "compiler does not need a declaration for main()" Every definition is a declaration, so I think the wording needs to be adjusted. "compiler declares it as one of the following two functions" Why "compiler declares"? We always provide a definition for main ourselves.

                – HolyBlackCat
                2 days ago







              • 1





                @HolyBlackCat: I see your point. Wording is important. Even if I change it, without quoting the entire standard, there will not be a complete answer. The answer is meant to be simple. See what you think of this update.

                – Gardener
                2 days ago






              • 6





                There's nothing special about the main function with regards to (forward) declaration. That's simply a red herring. Rather, we don't need to forward declare it since we're not referring to it before its definition. That's all.

                – Konrad Rudolph
                yesterday













              25












              25








              25







              No, the compiler does not need a forward declaration for main().



              main() is a special function in C++.



              Some important things to remember about main() are:



              1. The linker requires that one and only one main() function exist when creating an executable program.

              2. The compiler expects a main() function in one of the following two forms:

              int main () /* body */ 
              int main (int argc, char *argv[]) /* body */


              where body is zero or more statements



              An additional acceptable form is implementation specific and provides a list of the environment variables at the time the function is called:



              int main (int argc, char* argv[], char *envp[]) /* body */ 


              The coder must provide the 'definition' of main using one of these acceptable forms, but the coder does not need to provide a declaration. The coded definiton is accepted by the compiler as the declaration of main().



              1. If no return statement is provided, the compiler will provide a return 0; as the last statement in the function body.

              As an aside, there is sometimes confusion about whether a C++ program can make a call to main(). This is not recommended. The C++17 draft states that main() "shall not be used within a program." In other words, cannot be called from within a program. See e.g. Working Draft Standard for C++ Programming Language, dated "2017-03-21", Paragraph 6.6.1.3, page 66. I realize that some compilers support this (including mine), but the next version of the compiler could modify or remove that behavior as the standard uses the term "shall not".






              share|improve this answer















              No, the compiler does not need a forward declaration for main().



              main() is a special function in C++.



              Some important things to remember about main() are:



              1. The linker requires that one and only one main() function exist when creating an executable program.

              2. The compiler expects a main() function in one of the following two forms:

              int main () /* body */ 
              int main (int argc, char *argv[]) /* body */


              where body is zero or more statements



              An additional acceptable form is implementation specific and provides a list of the environment variables at the time the function is called:



              int main (int argc, char* argv[], char *envp[]) /* body */ 


              The coder must provide the 'definition' of main using one of these acceptable forms, but the coder does not need to provide a declaration. The coded definiton is accepted by the compiler as the declaration of main().



              1. If no return statement is provided, the compiler will provide a return 0; as the last statement in the function body.

              As an aside, there is sometimes confusion about whether a C++ program can make a call to main(). This is not recommended. The C++17 draft states that main() "shall not be used within a program." In other words, cannot be called from within a program. See e.g. Working Draft Standard for C++ Programming Language, dated "2017-03-21", Paragraph 6.6.1.3, page 66. I realize that some compilers support this (including mine), but the next version of the compiler could modify or remove that behavior as the standard uses the term "shall not".







              share|improve this answer














              share|improve this answer



              share|improve this answer








              edited yesterday









              iMalinowski

              10914




              10914










              answered 2 days ago









              GardenerGardener

              1,458616




              1,458616












              • Also note that the standard allows other implementation-defined signatures for main besides the two you listed here. A common option is to add a 3rd argument (after argv) that contains the environment variables (using the same method as extern char** environ)

                – SJL
                2 days ago











              • @SJL: Absolutely! I have only listed the ones that "must" be implemented by the compiler. The environ is also very helpful.

                – Gardener
                2 days ago






              • 8





                "compiler does not need a declaration for main()" Every definition is a declaration, so I think the wording needs to be adjusted. "compiler declares it as one of the following two functions" Why "compiler declares"? We always provide a definition for main ourselves.

                – HolyBlackCat
                2 days ago







              • 1





                @HolyBlackCat: I see your point. Wording is important. Even if I change it, without quoting the entire standard, there will not be a complete answer. The answer is meant to be simple. See what you think of this update.

                – Gardener
                2 days ago






              • 6





                There's nothing special about the main function with regards to (forward) declaration. That's simply a red herring. Rather, we don't need to forward declare it since we're not referring to it before its definition. That's all.

                – Konrad Rudolph
                yesterday

















              • Also note that the standard allows other implementation-defined signatures for main besides the two you listed here. A common option is to add a 3rd argument (after argv) that contains the environment variables (using the same method as extern char** environ)

                – SJL
                2 days ago











              • @SJL: Absolutely! I have only listed the ones that "must" be implemented by the compiler. The environ is also very helpful.

                – Gardener
                2 days ago






              • 8





                "compiler does not need a declaration for main()" Every definition is a declaration, so I think the wording needs to be adjusted. "compiler declares it as one of the following two functions" Why "compiler declares"? We always provide a definition for main ourselves.

                – HolyBlackCat
                2 days ago







              • 1





                @HolyBlackCat: I see your point. Wording is important. Even if I change it, without quoting the entire standard, there will not be a complete answer. The answer is meant to be simple. See what you think of this update.

                – Gardener
                2 days ago






              • 6





                There's nothing special about the main function with regards to (forward) declaration. That's simply a red herring. Rather, we don't need to forward declare it since we're not referring to it before its definition. That's all.

                – Konrad Rudolph
                yesterday
















              Also note that the standard allows other implementation-defined signatures for main besides the two you listed here. A common option is to add a 3rd argument (after argv) that contains the environment variables (using the same method as extern char** environ)

              – SJL
              2 days ago





              Also note that the standard allows other implementation-defined signatures for main besides the two you listed here. A common option is to add a 3rd argument (after argv) that contains the environment variables (using the same method as extern char** environ)

              – SJL
              2 days ago













              @SJL: Absolutely! I have only listed the ones that "must" be implemented by the compiler. The environ is also very helpful.

              – Gardener
              2 days ago





              @SJL: Absolutely! I have only listed the ones that "must" be implemented by the compiler. The environ is also very helpful.

              – Gardener
              2 days ago




              8




              8





              "compiler does not need a declaration for main()" Every definition is a declaration, so I think the wording needs to be adjusted. "compiler declares it as one of the following two functions" Why "compiler declares"? We always provide a definition for main ourselves.

              – HolyBlackCat
              2 days ago






              "compiler does not need a declaration for main()" Every definition is a declaration, so I think the wording needs to be adjusted. "compiler declares it as one of the following two functions" Why "compiler declares"? We always provide a definition for main ourselves.

              – HolyBlackCat
              2 days ago





              1




              1





              @HolyBlackCat: I see your point. Wording is important. Even if I change it, without quoting the entire standard, there will not be a complete answer. The answer is meant to be simple. See what you think of this update.

              – Gardener
              2 days ago





              @HolyBlackCat: I see your point. Wording is important. Even if I change it, without quoting the entire standard, there will not be a complete answer. The answer is meant to be simple. See what you think of this update.

              – Gardener
              2 days ago




              6




              6





              There's nothing special about the main function with regards to (forward) declaration. That's simply a red herring. Rather, we don't need to forward declare it since we're not referring to it before its definition. That's all.

              – Konrad Rudolph
              yesterday





              There's nothing special about the main function with regards to (forward) declaration. That's simply a red herring. Rather, we don't need to forward declare it since we're not referring to it before its definition. That's all.

              – Konrad Rudolph
              yesterday











              10














              It is illegal to call main from inside your program. That means the only thing that is going to call it is the runtime and the compiler/linker can handle setting that up.This means you do not need a prototype for main.






              share|improve this answer



























                10














                It is illegal to call main from inside your program. That means the only thing that is going to call it is the runtime and the compiler/linker can handle setting that up.This means you do not need a prototype for main.






                share|improve this answer

























                  10












                  10








                  10







                  It is illegal to call main from inside your program. That means the only thing that is going to call it is the runtime and the compiler/linker can handle setting that up.This means you do not need a prototype for main.






                  share|improve this answer













                  It is illegal to call main from inside your program. That means the only thing that is going to call it is the runtime and the compiler/linker can handle setting that up.This means you do not need a prototype for main.







                  share|improve this answer












                  share|improve this answer



                  share|improve this answer










                  answered 2 days ago









                  NathanOliverNathanOliver

                  97.9k16138215




                  97.9k16138215





















                      7














                      A definition of a function also implicitly declares it. If you need to reference a function before it is defined you need to declare it before you use it.



                      So writing the following is also valid:



                      int sum(int x, int y) 
                      return x + y;


                      int main()
                      std::cout << "The result is " << sum(1, 2);
                      return 0;



                      If you use a declaration in one file to make a function known to the compiler before it is defined, then its definition has to be known at linking time:



                      main.cpp



                      int sum(int x, int y);

                      int main()
                      std::cout << "The result is " << sum(1, 2);
                      return 0;



                      sum.cpp



                      int sum(int x, int y) 
                      return x + y;



                      Or sum could have its origin in a library, so you do not even compile it yourself.



                      The main function is not used/referenced in your code anywhere, so there is no need to add the declaration of main anywhere.



                      Before and after your main function the c++ library might execute some init and cleanup steps, and will call your main function. If that part of the library would be represented as c++ code then it would contain a declaration of int main() so that that it could be compiled. That code could look like this:



                      int main();

                      int __main()
                      __startup_runtime();

                      main();

                      __cleanup_runtime();



                      But then you again have the same problem with __main so at some point there is no c++ anymore and a certain function (main) just represents the entry point of your code.






                      share|improve this answer

























                      • C++ makes it UB to call main from inside the program, so C++ compilers can put those startup/cleanup calls right into the real main if they want. This rule lets C++ compilers work on top of C environments, for example, giving somewhere for static constructors to be called from if there's no other mechanism a compiler can use. (Compilers also have to recognize main as a special function name to give it an implicit return 0.)

                        – Peter Cordes
                        yesterday











                      • @PeterCordes from the perspective of the programmer it is UB to call the main function due to the the standard. But how the compile vendors or the os handles main is implementation dependent. So in theory the compiled result of the main could look like a regular function that is called by the run-time, or it could not exists and as you said, the compilers can put those startup/cleanup calls right at the entry point of the application around the code that is shown in the main.

                        – t.niese
                        yesterday











                      • Yup, in most implementations it is just a normal function (but with an implicit extern "C" to not do C++ name mangling on it, so the CRT startup code can link to it regardless of function signature), with real init work done in CRT code and/or from dynamic linker hooks. But like I commented Joshua's answer, ICC (Intel's compiler) does in fact add some startup code inside main itself (godbolt.org/z/oWlmlc), including setting DAZ and FTZ to disable subnormals for its default of -ffast-math. gcc/clang link different CRT startup files for fast-math or not.

                        – Peter Cordes
                        yesterday















                      7














                      A definition of a function also implicitly declares it. If you need to reference a function before it is defined you need to declare it before you use it.



                      So writing the following is also valid:



                      int sum(int x, int y) 
                      return x + y;


                      int main()
                      std::cout << "The result is " << sum(1, 2);
                      return 0;



                      If you use a declaration in one file to make a function known to the compiler before it is defined, then its definition has to be known at linking time:



                      main.cpp



                      int sum(int x, int y);

                      int main()
                      std::cout << "The result is " << sum(1, 2);
                      return 0;



                      sum.cpp



                      int sum(int x, int y) 
                      return x + y;



                      Or sum could have its origin in a library, so you do not even compile it yourself.



                      The main function is not used/referenced in your code anywhere, so there is no need to add the declaration of main anywhere.



                      Before and after your main function the c++ library might execute some init and cleanup steps, and will call your main function. If that part of the library would be represented as c++ code then it would contain a declaration of int main() so that that it could be compiled. That code could look like this:



                      int main();

                      int __main()
                      __startup_runtime();

                      main();

                      __cleanup_runtime();



                      But then you again have the same problem with __main so at some point there is no c++ anymore and a certain function (main) just represents the entry point of your code.






                      share|improve this answer

























                      • C++ makes it UB to call main from inside the program, so C++ compilers can put those startup/cleanup calls right into the real main if they want. This rule lets C++ compilers work on top of C environments, for example, giving somewhere for static constructors to be called from if there's no other mechanism a compiler can use. (Compilers also have to recognize main as a special function name to give it an implicit return 0.)

                        – Peter Cordes
                        yesterday











                      • @PeterCordes from the perspective of the programmer it is UB to call the main function due to the the standard. But how the compile vendors or the os handles main is implementation dependent. So in theory the compiled result of the main could look like a regular function that is called by the run-time, or it could not exists and as you said, the compilers can put those startup/cleanup calls right at the entry point of the application around the code that is shown in the main.

                        – t.niese
                        yesterday











                      • Yup, in most implementations it is just a normal function (but with an implicit extern "C" to not do C++ name mangling on it, so the CRT startup code can link to it regardless of function signature), with real init work done in CRT code and/or from dynamic linker hooks. But like I commented Joshua's answer, ICC (Intel's compiler) does in fact add some startup code inside main itself (godbolt.org/z/oWlmlc), including setting DAZ and FTZ to disable subnormals for its default of -ffast-math. gcc/clang link different CRT startup files for fast-math or not.

                        – Peter Cordes
                        yesterday













                      7












                      7








                      7







                      A definition of a function also implicitly declares it. If you need to reference a function before it is defined you need to declare it before you use it.



                      So writing the following is also valid:



                      int sum(int x, int y) 
                      return x + y;


                      int main()
                      std::cout << "The result is " << sum(1, 2);
                      return 0;



                      If you use a declaration in one file to make a function known to the compiler before it is defined, then its definition has to be known at linking time:



                      main.cpp



                      int sum(int x, int y);

                      int main()
                      std::cout << "The result is " << sum(1, 2);
                      return 0;



                      sum.cpp



                      int sum(int x, int y) 
                      return x + y;



                      Or sum could have its origin in a library, so you do not even compile it yourself.



                      The main function is not used/referenced in your code anywhere, so there is no need to add the declaration of main anywhere.



                      Before and after your main function the c++ library might execute some init and cleanup steps, and will call your main function. If that part of the library would be represented as c++ code then it would contain a declaration of int main() so that that it could be compiled. That code could look like this:



                      int main();

                      int __main()
                      __startup_runtime();

                      main();

                      __cleanup_runtime();



                      But then you again have the same problem with __main so at some point there is no c++ anymore and a certain function (main) just represents the entry point of your code.






                      share|improve this answer















                      A definition of a function also implicitly declares it. If you need to reference a function before it is defined you need to declare it before you use it.



                      So writing the following is also valid:



                      int sum(int x, int y) 
                      return x + y;


                      int main()
                      std::cout << "The result is " << sum(1, 2);
                      return 0;



                      If you use a declaration in one file to make a function known to the compiler before it is defined, then its definition has to be known at linking time:



                      main.cpp



                      int sum(int x, int y);

                      int main()
                      std::cout << "The result is " << sum(1, 2);
                      return 0;



                      sum.cpp



                      int sum(int x, int y) 
                      return x + y;



                      Or sum could have its origin in a library, so you do not even compile it yourself.



                      The main function is not used/referenced in your code anywhere, so there is no need to add the declaration of main anywhere.



                      Before and after your main function the c++ library might execute some init and cleanup steps, and will call your main function. If that part of the library would be represented as c++ code then it would contain a declaration of int main() so that that it could be compiled. That code could look like this:



                      int main();

                      int __main()
                      __startup_runtime();

                      main();

                      __cleanup_runtime();



                      But then you again have the same problem with __main so at some point there is no c++ anymore and a certain function (main) just represents the entry point of your code.







                      share|improve this answer














                      share|improve this answer



                      share|improve this answer








                      edited 2 days ago

























                      answered 2 days ago









                      t.nieset.niese

                      22.7k64066




                      22.7k64066












                      • C++ makes it UB to call main from inside the program, so C++ compilers can put those startup/cleanup calls right into the real main if they want. This rule lets C++ compilers work on top of C environments, for example, giving somewhere for static constructors to be called from if there's no other mechanism a compiler can use. (Compilers also have to recognize main as a special function name to give it an implicit return 0.)

                        – Peter Cordes
                        yesterday











                      • @PeterCordes from the perspective of the programmer it is UB to call the main function due to the the standard. But how the compile vendors or the os handles main is implementation dependent. So in theory the compiled result of the main could look like a regular function that is called by the run-time, or it could not exists and as you said, the compilers can put those startup/cleanup calls right at the entry point of the application around the code that is shown in the main.

                        – t.niese
                        yesterday











                      • Yup, in most implementations it is just a normal function (but with an implicit extern "C" to not do C++ name mangling on it, so the CRT startup code can link to it regardless of function signature), with real init work done in CRT code and/or from dynamic linker hooks. But like I commented Joshua's answer, ICC (Intel's compiler) does in fact add some startup code inside main itself (godbolt.org/z/oWlmlc), including setting DAZ and FTZ to disable subnormals for its default of -ffast-math. gcc/clang link different CRT startup files for fast-math or not.

                        – Peter Cordes
                        yesterday

















                      • C++ makes it UB to call main from inside the program, so C++ compilers can put those startup/cleanup calls right into the real main if they want. This rule lets C++ compilers work on top of C environments, for example, giving somewhere for static constructors to be called from if there's no other mechanism a compiler can use. (Compilers also have to recognize main as a special function name to give it an implicit return 0.)

                        – Peter Cordes
                        yesterday











                      • @PeterCordes from the perspective of the programmer it is UB to call the main function due to the the standard. But how the compile vendors or the os handles main is implementation dependent. So in theory the compiled result of the main could look like a regular function that is called by the run-time, or it could not exists and as you said, the compilers can put those startup/cleanup calls right at the entry point of the application around the code that is shown in the main.

                        – t.niese
                        yesterday











                      • Yup, in most implementations it is just a normal function (but with an implicit extern "C" to not do C++ name mangling on it, so the CRT startup code can link to it regardless of function signature), with real init work done in CRT code and/or from dynamic linker hooks. But like I commented Joshua's answer, ICC (Intel's compiler) does in fact add some startup code inside main itself (godbolt.org/z/oWlmlc), including setting DAZ and FTZ to disable subnormals for its default of -ffast-math. gcc/clang link different CRT startup files for fast-math or not.

                        – Peter Cordes
                        yesterday
















                      C++ makes it UB to call main from inside the program, so C++ compilers can put those startup/cleanup calls right into the real main if they want. This rule lets C++ compilers work on top of C environments, for example, giving somewhere for static constructors to be called from if there's no other mechanism a compiler can use. (Compilers also have to recognize main as a special function name to give it an implicit return 0.)

                      – Peter Cordes
                      yesterday





                      C++ makes it UB to call main from inside the program, so C++ compilers can put those startup/cleanup calls right into the real main if they want. This rule lets C++ compilers work on top of C environments, for example, giving somewhere for static constructors to be called from if there's no other mechanism a compiler can use. (Compilers also have to recognize main as a special function name to give it an implicit return 0.)

                      – Peter Cordes
                      yesterday













                      @PeterCordes from the perspective of the programmer it is UB to call the main function due to the the standard. But how the compile vendors or the os handles main is implementation dependent. So in theory the compiled result of the main could look like a regular function that is called by the run-time, or it could not exists and as you said, the compilers can put those startup/cleanup calls right at the entry point of the application around the code that is shown in the main.

                      – t.niese
                      yesterday





                      @PeterCordes from the perspective of the programmer it is UB to call the main function due to the the standard. But how the compile vendors or the os handles main is implementation dependent. So in theory the compiled result of the main could look like a regular function that is called by the run-time, or it could not exists and as you said, the compilers can put those startup/cleanup calls right at the entry point of the application around the code that is shown in the main.

                      – t.niese
                      yesterday













                      Yup, in most implementations it is just a normal function (but with an implicit extern "C" to not do C++ name mangling on it, so the CRT startup code can link to it regardless of function signature), with real init work done in CRT code and/or from dynamic linker hooks. But like I commented Joshua's answer, ICC (Intel's compiler) does in fact add some startup code inside main itself (godbolt.org/z/oWlmlc), including setting DAZ and FTZ to disable subnormals for its default of -ffast-math. gcc/clang link different CRT startup files for fast-math or not.

                      – Peter Cordes
                      yesterday





                      Yup, in most implementations it is just a normal function (but with an implicit extern "C" to not do C++ name mangling on it, so the CRT startup code can link to it regardless of function signature), with real init work done in CRT code and/or from dynamic linker hooks. But like I commented Joshua's answer, ICC (Intel's compiler) does in fact add some startup code inside main itself (godbolt.org/z/oWlmlc), including setting DAZ and FTZ to disable subnormals for its default of -ffast-math. gcc/clang link different CRT startup files for fast-math or not.

                      – Peter Cordes
                      yesterday











                      5














                      Nope. You can't call it anyway.



                      You only need forward declarations for functions called before they are defined. You need external declarations (which look exactly like forward declarations on purpose) for functions defined in other files.



                      But you can't call main in C++ so you don't need one. This is because the C++ compiler is allowed to modify main to do global initialization.



                      [I looked at crt0.c and it does have a declaration for main but that's neither here nor there].






                      share|improve this answer

























                      • You can call main, it's just typically bad practice.

                        – Cruz Jean
                        2 days ago






                      • 8





                        @CruzJean not just a bad practice, it's undefined behavior as far as I know

                        – Guillaume Racicot
                        2 days ago






                      • 5





                        @CruzJean Not bad practice. Calling it invokes undefined behavior.

                        – Algirdas Preidžius
                        2 days ago











                      • @AlgirdasPreidžius Ah, I stand corrected. Never knew about that.

                        – Cruz Jean
                        2 days ago











                      • This is because the C++ compiler is allowed to modify main to do global initialization. Is it? I can't see how that would even work as you would be assigning in main which can change the observable effects of the program.

                        – NathanOliver
                        2 days ago















                      5














                      Nope. You can't call it anyway.



                      You only need forward declarations for functions called before they are defined. You need external declarations (which look exactly like forward declarations on purpose) for functions defined in other files.



                      But you can't call main in C++ so you don't need one. This is because the C++ compiler is allowed to modify main to do global initialization.



                      [I looked at crt0.c and it does have a declaration for main but that's neither here nor there].






                      share|improve this answer

























                      • You can call main, it's just typically bad practice.

                        – Cruz Jean
                        2 days ago






                      • 8





                        @CruzJean not just a bad practice, it's undefined behavior as far as I know

                        – Guillaume Racicot
                        2 days ago






                      • 5





                        @CruzJean Not bad practice. Calling it invokes undefined behavior.

                        – Algirdas Preidžius
                        2 days ago











                      • @AlgirdasPreidžius Ah, I stand corrected. Never knew about that.

                        – Cruz Jean
                        2 days ago











                      • This is because the C++ compiler is allowed to modify main to do global initialization. Is it? I can't see how that would even work as you would be assigning in main which can change the observable effects of the program.

                        – NathanOliver
                        2 days ago













                      5












                      5








                      5







                      Nope. You can't call it anyway.



                      You only need forward declarations for functions called before they are defined. You need external declarations (which look exactly like forward declarations on purpose) for functions defined in other files.



                      But you can't call main in C++ so you don't need one. This is because the C++ compiler is allowed to modify main to do global initialization.



                      [I looked at crt0.c and it does have a declaration for main but that's neither here nor there].






                      share|improve this answer















                      Nope. You can't call it anyway.



                      You only need forward declarations for functions called before they are defined. You need external declarations (which look exactly like forward declarations on purpose) for functions defined in other files.



                      But you can't call main in C++ so you don't need one. This is because the C++ compiler is allowed to modify main to do global initialization.



                      [I looked at crt0.c and it does have a declaration for main but that's neither here nor there].







                      share|improve this answer














                      share|improve this answer



                      share|improve this answer








                      edited 2 days ago

























                      answered 2 days ago









                      JoshuaJoshua

                      24.4k550103




                      24.4k550103












                      • You can call main, it's just typically bad practice.

                        – Cruz Jean
                        2 days ago






                      • 8





                        @CruzJean not just a bad practice, it's undefined behavior as far as I know

                        – Guillaume Racicot
                        2 days ago






                      • 5





                        @CruzJean Not bad practice. Calling it invokes undefined behavior.

                        – Algirdas Preidžius
                        2 days ago











                      • @AlgirdasPreidžius Ah, I stand corrected. Never knew about that.

                        – Cruz Jean
                        2 days ago











                      • This is because the C++ compiler is allowed to modify main to do global initialization. Is it? I can't see how that would even work as you would be assigning in main which can change the observable effects of the program.

                        – NathanOliver
                        2 days ago

















                      • You can call main, it's just typically bad practice.

                        – Cruz Jean
                        2 days ago






                      • 8





                        @CruzJean not just a bad practice, it's undefined behavior as far as I know

                        – Guillaume Racicot
                        2 days ago






                      • 5





                        @CruzJean Not bad practice. Calling it invokes undefined behavior.

                        – Algirdas Preidžius
                        2 days ago











                      • @AlgirdasPreidžius Ah, I stand corrected. Never knew about that.

                        – Cruz Jean
                        2 days ago











                      • This is because the C++ compiler is allowed to modify main to do global initialization. Is it? I can't see how that would even work as you would be assigning in main which can change the observable effects of the program.

                        – NathanOliver
                        2 days ago
















                      You can call main, it's just typically bad practice.

                      – Cruz Jean
                      2 days ago





                      You can call main, it's just typically bad practice.

                      – Cruz Jean
                      2 days ago




                      8




                      8





                      @CruzJean not just a bad practice, it's undefined behavior as far as I know

                      – Guillaume Racicot
                      2 days ago





                      @CruzJean not just a bad practice, it's undefined behavior as far as I know

                      – Guillaume Racicot
                      2 days ago




                      5




                      5





                      @CruzJean Not bad practice. Calling it invokes undefined behavior.

                      – Algirdas Preidžius
                      2 days ago





                      @CruzJean Not bad practice. Calling it invokes undefined behavior.

                      – Algirdas Preidžius
                      2 days ago













                      @AlgirdasPreidžius Ah, I stand corrected. Never knew about that.

                      – Cruz Jean
                      2 days ago





                      @AlgirdasPreidžius Ah, I stand corrected. Never knew about that.

                      – Cruz Jean
                      2 days ago













                      This is because the C++ compiler is allowed to modify main to do global initialization. Is it? I can't see how that would even work as you would be assigning in main which can change the observable effects of the program.

                      – NathanOliver
                      2 days ago





                      This is because the C++ compiler is allowed to modify main to do global initialization. Is it? I can't see how that would even work as you would be assigning in main which can change the observable effects of the program.

                      – NathanOliver
                      2 days ago

















                      draft saved

                      draft discarded
















































                      Thanks for contributing an answer to Stack Overflow!


                      • Please be sure to answer the question. Provide details and share your research!

                      But avoid


                      • Asking for help, clarification, or responding to other answers.

                      • Making statements based on opinion; back them up with references or personal experience.

                      To learn more, see our tips on writing great answers.




                      draft saved


                      draft discarded














                      StackExchange.ready(
                      function ()
                      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55457704%2fdoes-int-main-need-a-declaration-on-c%23new-answer', 'question_page');

                      );

                      Post as a guest















                      Required, but never shown





















































                      Required, but never shown














                      Required, but never shown












                      Required, but never shown







                      Required, but never shown

































                      Required, but never shown














                      Required, but never shown












                      Required, but never shown







                      Required, but never shown







                      Popular posts from this blog

                      How to write a 12-bar blues melodyI-IV-V blues progressionHow to play the bridges in a standard blues progressionHow does Gdim7 fit in C# minor?question on a certain chord progressionMusicology of Melody12 bar blues, spread rhythm: alternative to 6th chord to avoid finger stretchChord progressions/ Root key/ MelodiesHow to put chords (POP-EDM) under a given lead vocal melody (starting from a good knowledge in music theory)Are there “rules” for improvising with the minor pentatonic scale over 12-bar shuffle?Confusion about blues scale and chords

                      What if the end-user didn't have the required library?What is setup.py?What is a clean, pythonic way to have multiple constructors in Python?What does Ruby have that Python doesn't, and vice versa?What is the reason for having '//' in Python?How do I create a namespace package in Python?How to package shared objects that python modules depend on?setuptools vs. distutils: why is distutils still a thing?Navigation in Windows 10 vs code not going to virtualenv library when the same library is installed at user levelPython create package for local usePackaging a project that uses multiple python versionsWhy is permission denied on pip install except for when “--user” is included at end of command?

                      Esgonzo ibérico Índice Descrición Distribución Hábitat Ameazas Notas Véxase tamén "Acerca dos nomes dos anfibios e réptiles galegos""Chalcides bedriagai"Chalcides bedriagai en Carrascal, L. M. Salvador, A. (Eds). Enciclopedia virtual de los vertebrados españoles. Museo Nacional de Ciencias Naturales, Madrid. España.Fotos