I ask because my compiler seems to think so, even though I don’t.
echo \'int main;\' | cc -x c - -Wall
echo \'int main;\' | c++ -x c++ - -Wall
I would like to add to the answers already given by citing the actual language standards.
Short answer (my opinion): only if your implementation uses a "freestanding execution environment".
All following quotes from C11
5. Environment
An implementation translates C source files and executes C programs in two dataprocessing-system environments, which will be called the translation environment and the execution environment [...]
5.1.2 Execution environments
Two execution environments are defined: freestanding and hosted. In both cases, program startup occurs when a designated C function is called by the execution environment.
5.1.2.1 Freestanding environment
In a freestanding environment (in which C program execution may take place without any benefit of an operating system), the name and type of the function called at program startup are implementation-defined.
5.1.2.2 Hosted environment
A hosted environment need not be provided, but shall conform to the following specifications if present.
5.1.2.2.1 Program startup
The function called at program startup is named main. [...] It shall be defined with a return type of int and with no parameters [...] or with two parameters [...] or equivalent or in some other implementation-defined manner.
From these, the following is observed:
In a freestanding execution environment, I would argue that it is a valid program that does not allow startup to happen, because there is no function present for that as required in 5.1.2. In a hosted execution environment, while your code introduces an object named main, it cannot provide a return value, so I would argue that it is not a valid program in this sense, although one could also argue like before that if the program is not meant to be executed (on might want to provide data only for example), then it just does not allow to do just that.
Short answer (my opinion): only if your implementation uses a "freestanding execution environment".
Quote from C++14
3.6.1 Main function
A program shall contain a global function called main, which is the designated start of the program. It is implementation-defined whether a program in a freestanding environment is required to define a main function. [...] It shall have a return type of type int, but otherwise its type is implementation-defined. [...] The name main is not otherwise reserved.
Here, as opposed to the C11 standard, less restrictions apply to the freestanding execution environment, as no startup function is mentioned at all, while for a hosted execution environment, the case is pretty much the same as for C11.
Again, I would argue that for the hosted case, your code is not a valid C++14 program, but I am sure that it is for the freestanding case.
Since my answer only considers the execution environment, I think the answer by dasblinkenlicht comes into play, as name mangling occuring in the translation environment happens beforehand. Here, I am not so sure that the quotes above are observed so strictly.
main
isn't a reserved word it's just a predefined identifier (like cin
, endl
, npos
...), so you could declare a variable called main
, initialize it and then print out its value.
Of course:
main()
function (libraries).EDIT
Some references:
main
is not a reserved word (C++11):
The function
main
shall not be used within a program. The linkage (3.5) ofmain
is implementation-defined. A program that defines main as deleted or that declares main to beinline
,static
, orconstexpr
is ill-formed. The namemain
is not otherwise reserved. [ Example: member functions, classes and enumerations can be calledmain
, as can entities in other namespaces. — end example ]
C++11 - [basic.start.main] 3.6.1.3
[2.11/3] [...] some identifiers are reserved for use by C++ implementations and standard libraries (17.6.4.3.2) and shall not be used otherwise; no diagnostic is required.
[17.6.4.3.2/1] Certain sets of names and function signatures are always reserved to the implementation:
- Each name that contains a double underscore __ or begins with an underscore followed by an uppercase letter (2.12) is reserved to the implementation for any use.
- Each name that begins with an underscore is reserved to the implementation for use as a name in the global namespace.
Reserved words in programming languages.
Reserved words may not be redefined by the programmer, but predefineds can often be overridden in some capacity. This is the case of main
: there are scopes in which a declaration using that identifier redefines its meaning.
Is int main;
a valid C/C++ program?
It is not entirely clear what a C/C++ program is.
Is int main;
a valid C program?
Yes. A freestanding implementation is allowed to accept such program. main
doesn't have to have any special meaning in a freestanding environment.
It is not valid in a hosted environment.
Is int main;
a valid C++ program?
Ditto.
Why does it crash?
The program doesn't have to make sense in your environment. In a freestanding environment the program startup and termination, and the meaning of main
, are implementation-defined.
Why does the compiler warn me?
The compiler may warn you about whatever it pleases, as long as it doesn't reject conforming programs. On the other hand, warning is all that's required to diagnose a non-conforming program. Since this translation unit cannot be a part of a valid hosted program, a diagnostic message is justified.
Is gcc
a freestanding environment, or is it a hosted environment?
Yes.
gcc
documents the -ffreestanding
compilation flag. Add it, and the warning goes away. You may want to use it when building e.g. kernels or firmware.
g++
doesn't document such flag. Supplying it seems to have no effect on this program. It is probably safe to assume that the environment provided by g++ is hosted. Absence of diagnostic in this case is a bug.