__Thiscall
Specifies the Thiscall calling convention in a procedure declaration
Syntax
`
declare Sub name __Thiscall [Overload] [Alias "alias"] ( parameters )
declare Function name __Thiscall [Overload] [Alias "alias"] ( parameters ) [ ByRef ] As return_type
Sub name [__Thiscall] [Overload] [Alias "alias"] ( parameters )
Function name [__Thiscall] [Overload] [Alias "alias"] ( parameters ) [ ByRef ] As return_type
`
Description
`Thiscall` is a calling convention for x86 targets where the first integral argument is passed in the `ECX` register instead of on the stack. All other arguments are passed right to left and callee cleans up the stack (like Stdcall).
On win32 x86, mingw+gcc will use `Thiscall` as the default calling convention for non-static member procedures in classes passing the hidden This parameter by `ECX` register instead of pushing to the stack.
Default calling convention on win32 x86 inside an extern "c++" block for non-static member procedures is `Thiscall`.
`Thiscall` can be explicitly specified for normal procedures and static member procedures to override the default calling convention.
Other calling conventions (Cdecl/Stdcall/etc) can be explicitly specified to override the default `Thiscall` calling convention on non-static member procedures.
`Thiscall` can be specified at both the declaration and the definition.
If a procedure definition has a declaration (with calling convention explicit or by default) and the definition does not explicitly specify a calling convention, then the calling convention is implied by the declaration.
Example
- If inside extern "c++" and also on win32 / x86, and it's a non-static member procedure, and no other calling convention is given, the default is __thiscall:
`
Extern "c++"
Type T Extends Object
Declare Constructor() '' __thiscall is default
End Type
Constructor T() '' __thiscall is default
End Constructor
End Extern
`
- If definition is outside the extern "c++" block, then __thiscall is optional on the definition (if the default for the non-static member procedure was __thiscall):
`
Extern "c++"
Type T Extends Object
Declare Constructor() '' __thiscall is default
End Type
End Extern
Constructor T() '' __thiscall is implied by declaration
End Constructor
`
Version

- Since fbc 1.10.0:

- `Thiscall` calling convention is used as default for non-static member procedures under extern "c++" / win32 / x86.
- `Thiscall` can also be explicitly specified for normal procedures and static member procedures to override the default calling convention.

- Since fbc 1.08.0

Differences from QB

- New to FreeBASIC

See also

- `cdecl`, `stdcall`, `Fastcall`
- `Declare`
- `Sub`, `Function`