Re: C/C++ calling convention
On Aug 26, 12:25 am, "BGB / cr88192" <cr88...@hotmail.com> wrote:
"James Kanze" <james.ka...@gmail.com> wrote in message
news:13533014-dba5-456f-a857-5f2ef2b676f0@l6g2000yqb.googlegroups.com...
On Aug 25, 3:44 pm, Goran Pusic <gor...@cse-semaphore.com> wrote:
On Aug 25, 4:18 pm, Stanis=B3aw Findeisen <nore...@eisenbits.com> wrote=
:
[...]
Any compiler provides you with a way to specify what calling
convention you want from a list of calling conventions chosen by that
compiler (look for e.g. __cdecl).
<--
On most machines, there is only one reasonable way to pass
arguments when calling a function, and most compilers do not
need or have extensions to specify many different calling
conventions---they use the standard ``extern "language"''.
-->
well, if one excludes 32 bit Windows, where in practice 4 calling
conventions are commonly used:
cdecl; stdcall; fastcall; and thiscall (modified cdecl).
By "most machines", I meant most types of machines. Windows is
a bit of an exception, although even here, it's only really an
exception when using VC++, who decided not to use the standard
mechanism. (cdecl and stdcall resolve to ``extern "C"'' and
``extern "Pascal"'', I think. And thiscall is an extension of
cdecl, only relevant for ``extern "C++"''. The language also
allows a compiler to define something like ``extern "Fast"'',
although why one would use a slow call when a fast one is
available is beyond me.)
in most cases, fastcall can be ignored (it is almost never
used for external linkage AFAICT), and thiscall can simply be
regarded as a special case of cdecl.
this is a major reason for modifier tags like WINAPI and
similar: they wrap the calling convention keywords.
on 64-bit Windows, there is a single calling convention (Win64);
on 64-bit Linux and OSX, there is a single calling convention (AMD64);
As is the case under Solaris, HP/UX and AIX. And probably every
other system around.
on 32-bit Linux, in practice pretty much everyone just uses
cdecl...
On 32-bit Linux, I've never used anything.
IIRC, MS-DOS was a mess though, with many compilers doing
things differently, so code from one compiler would not
normally link correctly with code produced by another.
Yes and no. All of the C compilers I tried did the same thing.
All of the C++ compilers were different. But that's the case
almost universally today as well.
32-bit Windows mostly stabilized the calling convention and
object-file format mess (nearly everything is either cdecl or
stdcall, and uses COFF...).
Windows defines an ABI for C, I think (which it uses when
calling into system DLL's).
--
James Kanze