Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C++ declare 'main' as a reference to function?

What if I define main as a reference to function?

#include<iostream>
#include<cstring>

using namespace std;

int main1()
{
    cout << "Hello World from main1 function!" << endl;
    return 0;
}

int (&main)() = main1;

What will happen? I tested in an online compiler with error "Segmentation fault":

here

And under VC++ 2013 it will create a program crashing at run-time!

A code calling the data of the function pointer as a code will be compiled which will immediately crash on launch.

I would also like an ISO C++ standard quote about this.

The concept will be useful if you want to define either of 2 entry-points depending on some macro like this:

int main1();

int main2();

#ifdef _0_ENTRY
int (&main)() = main1;
#else
int (&main)() = main2;
#endif
like image 305
AnArrayOfFunctions Avatar asked Feb 12 '15 18:02

AnArrayOfFunctions


2 Answers

That's not a conformant C++ program. C++ requires that (section 3.6.1)

A program shall contain a global function called main

Your program contains a global not-a-function called main, which introduces a name conflict with the main function that is required.


One justification for this would be it allows the hosted environment to, during program startup, make a function call to main. It is not equivalent to the source string main(args) which could be a function call, a function pointer dereference, use of operator() on a function object, or construction of an instance of a type main. Nope, main must be a function.

One additional thing to note is that the C++ Standard never says what the type of main actually is, and prevents you from observing it. So implementations can (and do!) rewrite the signature, for example adding any of int argc, char** argv, char** envp that you have omitted. Clearly it couldn't know to do this for your main1 and main2.

like image 153
Ben Voigt Avatar answered Sep 19 '22 13:09

Ben Voigt


This would be useful if you want to define either of 2 entry-points depending on some macro

No, not really. You should do this:

int main1();
int main2();

#ifdef _0_ENTRY
   int main() { return main1(); }
#else
   int main() { return main2(); }
#endif
like image 32
Lightness Races in Orbit Avatar answered Sep 20 '22 13:09

Lightness Races in Orbit