Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is this a valid definition for main()

The C11 Standard declares that:

5.1.2.2.1 Program startup

  1. The function called at program startup is named main. The implementation declares no prototype for this function. It shall be defined with a return type of int and with no parameters:

    int main(void) { /* ... */ }
    

    or with two parameters (referred to here as argc and argv, though any names may be used, as they are local to the function in which they are declared):

    int main(int argc, char *argv[]) { /* ... */ }
    

    or equivalent; 10), or in some other implementation-defined manner.


10) Thus, int can be replaced by a typedef name defined as int, or the type of argv can be written as char ** argv, and so on.

We will ignore this part: or in some other implementation-defined manner. since I'm interested only in definitions equivalent to the two above examples.

Would this be a valid definition for main since char* a[4] and char** are equivalent:

int main(int argc, char* argv[4]){/*...*/}

How about a VLA array, we are assuming printf will return a positive int value:

int main(int argc, char* argv[printf("Hello there!")]){/*...*/}
like image 708
this Avatar asked Jun 23 '15 10:06

this


People also ask

What is this word valid?

valid implies being supported by objective truth or generally accepted authority.

What means not valid?

not based on truth or reason: The results of the experiment were said to be non-valid because of the inconsistent methodology employed.

What is a valid reason?

a reason that most people would find acceptable or believable.

What do we mean by valid information?

In effect, the validity of information is its relevance and appropriateness to your research question and the directness and strength of its association with the concepts under scrutiny. Often you will have to use best available information whose validity may be weak.


2 Answers

Yes, this is all covered by the "or equivalent". The footnote about renaming parameters or using typedefed types are just examples.

My favorite variant is

int main(int argc, char* argv[argc+1]){/*...*/}

because it has the most information about the semantic of all main functions.

like image 134
Jens Gustedt Avatar answered Sep 28 '22 05:09

Jens Gustedt


int main(int argc, char* argv[4]){/*...*/}  

is a valid signature of main. Compiler will ignore 4 in char argv[4] and it is equivalent to char argv[] = char **argv. Same goes with second signature.

like image 24
haccks Avatar answered Sep 28 '22 03:09

haccks