{{fbdoc item="title" value="__FB_QUERY_SYMBOL__"}}---- Intrinsic define (macro) performed by the compiler, and its associated sub-macros. {{fbdoc item="syntax"}}## ""__FB_QUERY_SYMBOL__( what, sym )"" ## {{fbdoc item="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: [[KeyPgDim|Dim]] //b// [[KeyPgAs|As]] [[KeyPgBoolean|Boolean]] ... //b// = **""isXXXXX""**( //sym// ) ## {{fbdoc item="param"}} ##//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 {{fbdoc item="desc"}} **##""__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. {{fbdoc item="ex"}} Using convenient sub-macros from the ##./inc/fbc-int/symbol.bi## file (indirectly calling **##""__FB_QUERY_SYMBOL__""##**) {{fbdoc item="filename" value="examples/manual/defines/fbquerysymbol.bas"}}%%(freebasic) #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) Sleep %% Using directly **##""__FB_QUERY_SYMBOL__""##** and some declarations from the ##./inc/fbc-int/symbol.bi## file to output the data class of a symbol: {{fbdoc item="filename" value="examples/manual/defines/fbquerysymbol2.bas"}}%%(freebasic) #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 ) Sleep %% 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: {{fbdoc item="filename" value="examples/manual/defines/fbquerysymbol3.bas"}}%%(freebasic) #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 ) ) Sleep %% {{fbdoc item="ver"}} - Since fbc 1.20.0 : **##""__FB_QUERY_SYMBOL__""##** extended to return mangled names - Since fbc 1.10.0 {{fbdoc item="diff"}} - New to ""FreeBASIC"" {{fbdoc item="back" value="CatPgDddefines|Intrinsic Defines"}}