FB_QUERY_SYMBOL
- Source: https://www.freebasic.net/wiki/wikka.php?wakka=KeyPgDdfbquerysymbol
- Last revised: 2025-07-09
Intrinsic define (macro) performed by the compiler, and its associated sub-macros.
Syntax
` FB_QUERY_SYMBOL( what, sym )
`
Usage
The ./inc/fbc-int/symbol.bi header exposes internals of the fbc compiler through the built-in macro __FB_QUERY_SYMBOL__.
In addition, many convenient sub-macros with 'is' as name prefix (also defined in the file ./inc/fbc-int/symbol.bi) help the user to indirectly call the generic built-in macro __FB_QUERY_SYMBOL__:
#include once "fbc-int/symbol.bi"
using FBC
' then:
Dim b As Boolean
...
b = isXXXXX( sym )Parameters
sym
symbol name to query
b
boolean to store the return value from the macro
XXXXX
body of the sub-macro name standing the kind of query
Description
__FB_QUERY_SYMBOL__ is a generic built-in macro for querying fbc symbol internals.
In the file ./inc/fbc-int/symbol.bi, many convenient and specialized sub-macros with 'is' as name prefix ('isXXXXX') are also defined (where 'XXXXX' stands for the kind of query).
They help the user to indirectly call the generic built-in macro __FB_QUERY_SYMBOL__ without knowing the encoding of its first parameter and its return value, but passing the only sym parameter to those sub-macros which only return -1 (for True) or 0 (for False).
For three of the query types, convenient and specialized sub-macros are available:
'class of symbols' (like variable, constant, procedure, namespace, ...),
'class of data' (like integer, float, string, UDT, ...),
'type of data' (like boolean, byte, ubyte, short, ...).
in order to test whether a symbol matches an element of the considered family.
Examples
Using convenient sub-macros from the ./inc/fbc-int/symbol.bi file (indirectly calling __FB_QUERY_SYMBOL__)
start GeSHi
#include once "fbc-int/symbol.bi"
Using FBC
Type T
i As Integer
End Type
Dim x As T
Print isUDT( T ) '' returns -1 (true)
Print isVariable( T ) '' returns 0 (false)
Print isUDT( x ) '' returns 0 (false)
Print isVariable( x ) '' returns -1 (true)
Sleepend GeSHi
Using directly __FB_QUERY_SYMBOL__ and some declarations from the ./inc/fbc-int/symbol.bi file to output the data class of a symbol:
start GeSHi
#include once "fbc-int/symbol.bi"
Using FBC
Function dataclassToStr( ByVal classid As fbc.FB_DATACLASS ) As String
Static As ZString Ptr classnames _
( FB_DATACLASS.FB_DATACLASS_INTEGER To FB_DATACLASS.FB_DATACLASS_UDT ) _
= { @"integer", @"float", @"string", @"udt" }
Select Case classid
Case LBound(classnames) To UBound(classnames)
Return *classnames(classid)
Case Else
Return "*invalid*"
End Select
End Function
#macro show_dataclass( sym )
Scope
Var classid = __FB_QUERY_SYMBOL__( FB_QUERY_SYMBOL.dataclass, sym )
Print Left( " [" & classid & "] " & dataclassToStr(classid) + Space(16), 16 ) & ": ";
Print #sym
End Scope
#endmacro
Dim As Byte b
Dim As Double d
Dim As String s
Type T
Dim As Long l
End Type
Dim As T t1
Print "EXAMPLES OF '__FB_QUERY_SYMBOL__( FB_QUERY_SYMBOL.dataclass, sym )':"
show_dataclass( b )
show_dataclass( d )
show_dataclass( s )
show_dataclass( T )
show_dataclass( T.l )
show_dataclass( t1 )
show_dataclass( t1.l )
Sleepend GeSHi
Using directly __FB_QUERY_SYMBOL__ and some declarations from the ./inc/fbc-int/symbol.bi file to output the typename as text, the typename as text with special characters replaced with '_', and the decorated (mangled) type name (WIP), of a symbol:
start GeSHi
#include once "fbc-int/symbol.bi"
Using FBC
Namespace NS
Type T
Dim As Const String Const Ptr Ptr pps
End Type
End Namespace
#print TypeOf(NS.T.pps)
Print "type name : " & __FB_QUOTE__( __FB_QUERY_SYMBOL__( FB_QUERY_SYMBOL.typename, NS.T.pps ) )
Print "type name id : " & __FB_QUOTE__( __FB_QUERY_SYMBOL__( FB_QUERY_SYMBOL.typenameid, NS.T.pps ) )
Print "mangled type : " & __FB_QUOTE__( __FB_QUERY_SYMBOL__( FB_QUERY_SYMBOL.mangletype, NS.T.pps ) )
Sleepend GeSHi
Version
- Since fbc 1.20.0 :
__FB_QUERY_SYMBOL__extended to return mangled names - Since fbc 1.10.0
Differences from QB
- New to FreeBASIC
Back to DocToc