Alias "modifier" は、データ型の後に指定すると、データ型に代替の意味を与えます。
これは、FreeBASIC 以外の言語とのリンクに必要な場合があります。
パブリック・シンボル名は、シンボルに使われる、データ型に関する情報をエンコードするために、修飾されています(装飾されています)。
c言語とリンクする場合、
alias 修飾子の特別な意味は、無意味です。追加情報は、パブリック名にエンコードされないためです。
c++ 言語とリンクする場合、通常、より多くの情報がパブリック・シンボルにエンコードされ、
alias 修飾子が必要になる場合があります。
パブリック名はコンパイルされたオブジェクト・ファイルに書き込まれます。そして、リンカによって、あるオブジェクト・モジュールから別のオブジェクト・モジュールに、シンボル名を一致させるために使われます。
使われるバックエンド(gasまたはgcc)コード放出に関係なく、データ型のマッピングには、同じルールが使われます。
また、FB のコンパイル済みコードが、自身のオブジェクト・モジュールや、他の言語からコンパイルされたオブジェクト・モジュール(またはライブラリ)と、矛盾なくリンクできることを目的としています 。
サポートされている修飾子
byte alias "char"
ubyte alias "char"
FB の 8 ビットのバイト型を c/c++ の 8 ビットの char 型にマップするために使われます。
long alias "long"
ulong alias "long"
Win 64ビット・ターゲットでは、FB の 32ビット
long と
ulong 型を、32ビット
int 型ではなく、c/c++ の32ビット
long [int] 型にマッピングするために使われます。
any alias "char" ptr
Maps any ptr to c/c++'s char *. In c/c++, char, signed char, and unsigned char, are three distinct types.
- byte ptr maps to signed char *
- ubyte ptr maps to unsigned char *
- On some platforms the variable argument list va_list type is a typed as a char *, but FB does not have an equivalent type, therefore any ptr is used instead. Linking with names encoded with this type will fail since, normally, FB encodes void * data type instead of char *.
- alias "char" keeps the any ptr behaviour in FB but then encodes the public name as char * for linking.
any alias "__builtin_va_list" ptr
Maps the data type to gcc's __builtin_va_list type
- expected that gcc's built-in type is a pointer type
- used on dos, win32, win64, linux-x86, targets
- see cvalist for default usage in the cva_list data type
alias "__builtin_va_list"
Maps the data type to gcc's __builtin_va_list type
- expected that gcc's built-in type is a struct type
- used on aarch64 target
- see cvalist for default usage in the cva_list data type
alias "__builtin_va_list[]"
Maps the data type to gcc's __builtin_va_list type
- expected that gcc's built-in type is a struct array type
- used on linux-x86_64 target
- see cvalist for default usage in the cva_list data type
データ型マッピングの詳細
On all targets, FB to c/c++:
Several of FB's data types are consistently mapped across all targets:
- 8-bit byte maps to signed char
- 8-bit ubyte maps to unsigned char
- 16-bit short maps to [signed] short [int]
- 16-bit ushort maps to unsigned short [int]
- 32-bit long maps to int
- 32-bit ulong maps to unsigned int
- 64-bit longint maps to long long [int]
- 64-bit ulongint maps to unsigned long long [int]
On Dos/Win/Linux 32-bit targets, FB to c/c++:
integer on 32-bit targets is 32-bits wide
- 32-bit integer maps to long [int]
- 32-bit uinteger maps to unsigned long [int]
On Linux 64-bit targets, FB to c/c++:
integer on 64-bit targets is 64-bits wide
- 64-bit integer maps to long [int]
- 64-bit uinteger maps to unsigned long [int]
On Win 64-bit targets, FB to c/c++:
64ビット・ターゲットの
integer は、64ビット幅です。
ただし、Win ターゲットでは、c/c++ の
long int 型は、64ビットではなく32ビットであり、FB の
longint 型で既に使われているため、
long long int 修飾は使えません。
2 つの異なるデータ型に、同じ修飾(装飾)を再利用すると、関数の多重定義が失敗するか、定義が重複します。
64ビット・ターゲットの
Integer が、常に 64ビットであるという FB の動作を維持するために、カスタム・データ型で、シンボルを修飾(装飾)し、サイズを64ビットに保ちます。
- 64-bit integer maps to custom INTEGER
- 64-bit uinteger maps to custom UINTEGER
To create a data type in FB that will map to c/c++'s long [int] 32-bit on win, we must use alias modifier.
- 32-bit long alias "long" maps to long [int]
- 32-bit ulong alias "long" maps to unsigned long [int]
例えば、
extern c++ : declare sub proc( byval as long alias "long" ) : end extern.
これにより、
FreeBASIC は、32ビットの
long int 型を必要とする、外部 c++ 手続き(win-64)を呼び出すことができます。
この方法での
Alias の使用は、win-64 ターゲットのみに影響し、他のすべてのターゲットでは無視されます。