Jump to content

Main function: Difference between revisions

From Wikipedia, the free encyclopedia
Content deleted Content added
Should be merged to Entry point
 
(One intermediate revision by one other user not shown)
Line 1: Line 1:
#REDIRECT [[Entry point]]
{{cleanup-bare URLs|date=June 2013}}
{{Merge to|Entry point|date=October 2013}}
In many [[programming language]]s, the '''main function''' is [[entry point|where a program starts execution]]. It is responsible for the high-level organization of the program's functionality, and typically has access to the [[command-line argument|command arguments]] given to the program when it was executed.


{{Redirect category shell|1=
The main function is generally the first programmer-written [[subroutine|function]] that runs when a program starts, and is invoked directly from the system-specific initialization contained in [[crt0]] or equivalent. However, some languages can execute user-written functions before main runs, such as the constructors of [[C++]] global objects.
{{R from merge}}

}}
==Variants==

===C and C++===
In [[C (programming language)|C]] and [[C++]], the [[function prototype]] of the main function looks like one of the following:

<source lang="c">
int main(void);
int main();

int main(int argc, char **argv);
int main(int argc, char *argv[]);
</source>

The [[parameter (computer science)|parameter]]s <code>argc</code>, ''argument count'', and <code>argv</code>, ''argument vector'',<ref>argv: the vector term in this variable's name is used in traditional sense to refer to strings.</ref> respectively give the number and values of the program's [[command-line argument]]s. The names of <code>argc</code> and <code>argv</code> may be any valid identifier in C, but it is common convention to use these names. In C++, the names are to be taken literally, and the "void" in the parameter list is to be omitted, if strict conformance is desired.<ref>[http://groups.google.com/group/comp.std.c++/browse_thread/thread/a1e5504b499bc58f] - Parameter types and names of main.</ref> Other platform-dependent formats are also allowed by the C and C++ standards, except that in C++ the return type must always be <code>int</code>;<ref>Section 3.6.1.2, Standard C++ 2011 edition.</ref> for example, [[Unix]] (though not [[POSIX.1]]) and [[Microsoft Windows]] have a third argument giving the program's [[environment variable|environment]], otherwise accessible through <code>getenv</code> in <code>[[stdlib.h]]</code>:
<source lang="c">
int main(int argc, char **argv, char **envp);
</source>

[[Mac OS X]] and [[Darwin (operating system)|Darwin]] have a fourth parameter containing arbitrary OS-supplied information, such as the path to the executing binary:<ref>[http://unixjunkie.blogspot.com/2006/02/char-apple-argument-vector.html The <code>char *apple</code> Argument Vector]</ref>

<source lang="c">
int main(int argc, char **argv, char **envp, char **apple);
</source>

The value returned from the main function becomes the [[exit status]] of the process, though the C standard only ascribes specific meaning to two values: <code>EXIT_SUCCESS</code> (traditionally 0) and <code>EXIT_FAILURE</code>. The meaning of other possible return values is implementation-defined. In case a return value is not defined by the programmer, an implicit <code>return 0;</code> at the end of the <code>main()</code> function is inserted by the compiler; this behavior is required by the C++ standard.

It is guaranteed that <code>argc</code> is non-negative and that <code>argv[argc]</code> is a [[null pointer]]. By convention, the command-line arguments specified by <code>argc</code> and <code>argv</code> include the name of the program as the first element if <code>argc</code> is greater than 0; if a user types a command of "<code>rm file</code>", the [[shell (computing)|shell]] will initialise the <code>[[rm (Unix)|rm]]</code> process with <code>argc = 2</code> and <code>argv = ["rm", "file", NULL]</code>. As <code>argv[0]</code> is the name that processes appear under in <code>[[ps (Unix)|ps]]</code>, <code>[[top (Unix)|top]]</code> etc., some programs, such as [[Daemon (computer software)|daemon]]s or those running within an [[interpreter (computing)|interpreter]] or [[virtual machine]] (where <code>argv[0]</code> would be the name of the host executable), may choose to alter their argv to give a more descriptive <code>argv[0]</code>, usually by means of the <code>[[Exec (operating system)|exec]]</code> system call.

The <code>main()</code> function is special; normally every C and C++ program must define it exactly once.

If declared, <code>main()</code> must be declared as if it has external linkage; it cannot be declared <code>static</code> or <code>inline</code>.

In C++, <code>main()</code> must be in the global [[namespace]] (i.e. <code>::main</code>), cannot be overloaded, and cannot be a [[member function]], although the name is not otherwise reserved, and may be used for member functions, classes, enumerations, or non-member functions in other namespaces. In C++ (unlike C) <code>main()</code> cannot be called [[Recursion (computer science)|recursively]] and cannot have its address taken.

===C#===
When executing a program written in [[C Sharp (programming language)|C#]], the [[Common Language Runtime|CLR]] searches for a static method marked with the <code>.entrypoint</code> IL directive, which takes either no arguments, or a single argument of type <code>string[]</code>, and has a return type of <code>void</code> or <code>int</code>, and executes it.<ref>{{cite web|url=http://msdn.microsoft.com/msdnmag/issues/04/02/NETConsoleApps/ |title=Console Appplications in .NET, or Teaching a New Dog Old Tricks |publisher=Msdn.microsoft.com |date=2003-06-12 |accessdate=2013-08-19}}</ref>

<source lang="csharp">
static void Main();
static void Main(string[] args);
int Main();
static int Main(string[] args);
</source>

Command-line arguments are passed in <code>args</code>, similar to how it is done in Java. For versions of <code>Main()</code> returning an integer, similar to both C and C++, it is passed back to the environment as the exit status of the process.

===D===
In [[D (programming language)|D]], the [[function prototype]] of the main function looks like one of the following:

<source lang="D">
void main();
void main(string[] args);
int main();
int main(string[] args);
</source>

Command-line arguments are passed in <code>args</code>, similar to how it is done in C# or Java. For versions of <code>main()</code> returning an integer, similar to both C and C++, it is passed back to the environment as the exit status of the process.

===Go===
In [[Go (programming language)|Go]] programming language, program execution starts with the <code>main</code> function of the <code>package main</code>

<source lang="go">
package main

import "fmt"

func main() {
fmt.Println("Hello, World!")
}
</source>

===Haskell===
A [[Haskell (programming language)|Haskell]] program must contain a name called <code>main</code> bound to a value of type <code>IO t</code>, for some type <code>t</code>;<ref>{{cite web|url=http://www.haskell.org/onlinereport/modules.html |title=The Haskell 98 Report: Modules |publisher=Haskell.org |date= |accessdate=2013-08-19}}</ref> which is usually <code>IO ()</code>. <code>IO</code> is a [[monads in functional programming|monad]], which organizes [[Side effect (computer science)|side-effects]] in terms of [[purely functional]] code.<ref>[http://geekrant.wordpress.com/2008/06/23/misconceptions/ Some Haskell Misconceptions: Idiomatic Code, Purity, Laziness, and IO] — on Haskell's monadic IO></ref> The <code>main</code> value represents the side-effects-ful computation done by the program. The result of the computation represented by <code>main</code> is discarded; that is why <code>main</code> usually has type <code>IO ()</code>, which indicates that the type of the result of the computation is <code>()</code>, the [[unit type]], which contains no information.

<source lang="haskell">
main :: IO()
main =
putStrLn "Hello, World!"
</source>

Command line arguments are not given to <code>main</code>; they must be fetched using another IO action, such as [http://haskell.org/ghc/docs/latest/html/libraries/base/System-Environment.html#v%3AgetArgs <code>System.Environment.getArgs</code>].

===Java===
[[Java (programming language)|Java]] programs start executing at the main [[method (computer science)|method]], which has the following [[method heading]]:

<source lang="java5">
public static void main(String[] args)
public static void main(String... args)
public static void main(String args[])
</source>

Command-line arguments are passed in <code>args</code>. As in C and C++, the name "<code>main()</code>" is special. Java's main methods do not return a value directly, but one can be passed by using the <code>System.exit()</code> method.

Unlike C, the name of the program is not included in <code>args</code>, because the name of the program is exactly the name of the class that contains the main method called, so it is already known. Also unlike C, the number of arguments need not be included, since the array class in Java has an attribute that keeps track of how many elements there are.

===Pike===
In [[Pike (programming language)|Pike]] syntax is similar to that of C and C++. The execution begins at <code>main</code>. The "<code>argc</code>" variable keeps the number of [[Parameter (computer science)|arguments]] passed to the program. The "<code>argv</code>" variable holds the value associated with the arguments passed to the program.

Example:
int main(int argc, array(string) argv)

===REALbasic===
In [[REALbasic]], there are two different project types, each with a different main entry point. Desktop (GUI) applications start with the <code>App.Open</code> event of the project's <code>Application</code> object. Console applications start with the <code>App.Run</code> event of the project's <code>ConsoleApplication</code> object. In both instances, the main function is automatically generated, and cannot be removed from the project.

===Visual Basic===
In [[Visual Basic]], when a project contains no forms, the startup object may be the <code>Main()</code> procedure. The <code>Command$</code> function can be optionally used to access the argument portion of the command line used to launch the program:
<source lang="vb">
Sub Main()
Debug.Print "Hello World!"
MsgBox "Arguments if any are: " & Command$
End Sub
</source>

==References==
{{Reflist|2}}

==External links==
<!--Please see this URL before adding external links here: http://meta.wikimedia.org/wiki/When_should_I_link_externally -->
* [http://www.javaexperience.com/main-method-in-java/ How main method works in Java].

{{DEFAULTSORT:Main Function (Programming)}}
[[Category:Subroutines]]
[[Category:Programming language comparisons]]

Latest revision as of 00:05, 8 June 2017

Redirect to: