When passing argument to
main() in a C or C++ application, will
argv always be the name of the executable? Or is this just a common convention and not guaranteed to be true 100% of the time?
Guesswork (even educated guesswork) is fun but you really need to go to the standards documents to be sure. For example, ISO C11 states (my emphasis):
If the value of
argcis greater than zero, the string pointed to by
argvrepresents the program name;
argvshall be the null character if the program name is not available from the host environment.
So no, it's only the program name if that name is available. And it "represents" the program name, not necessarily is the program name. The section before that states:
If the value of
argcis greater than zero, the array members
argv[argc-1]inclusive shall contain pointers to strings, which are given implementation-defined values by the host environment prior to program startup.
This is unchanged from C99, the previous standard, and means that even the values are not dictated by the standard - it's up to the implementation entirely.
This means that the program name can be empty if the host environment doesn't provide it, and anything else if the host environment does provide it, provided that "anything else" somehow represents the program name. In my more sadistic moments, I would consider translating it into Swahili, running it through a substitution cipher then storing it in reverse byte order :-).
However, implementation-defined does have a specific meaning in the ISO standards - the implementation must document how it works. So even UNIX, which can put anything it likes into
argv with the
exec family of calls, has to (and does) document it.
*nix type systems with
argv will be whatever the caller puts into the
argv0 spot in the
The shell uses the convention that this is the program name, and most other programs follow the same convention, so
argv usually the program name.
But a rogue Unix program can call
exec() and make
argv anything it likes, so no matter what the C standard says, you can't count on this 100% of the time.