Skip to content

FB_QUERY_SYMBOL


编译器执行的内置定义(宏)及其关联子宏。

语法

` FB_QUERY_SYMBOL( what, sym )

`

用法

./inc/fbc-int/symbol.bi 头文件通过内置宏 __FB_QUERY_SYMBOL__ 公开 fbc 编译器内部信息。

此外,文件 ./inc/fbc-int/symbol.bi 中还定义了许多以 'is' 为名称前缀的便利子宏,帮助用户间接调用通用内置宏 __FB_QUERY_SYMBOL__

vb
#include once "fbc-int/symbol.bi"
using FBC

' then:

Dim b As Boolean
...
b = isXXXXX( sym )

参数

sym

要查询的符号名

b

用于存储宏返回值的布尔变量

XXXXX

代表查询类型的子宏名称主体

描述

__FB_QUERY_SYMBOL__ 是用于查询 fbc 符号内部信息的通用内置宏。

在文件 ./inc/fbc-int/symbol.bi 中,还定义了许多以 'is' 为名称前缀的便利专用子宏('isXXXXX',其中 'XXXXX' 代表查询类型)。

这些子宏帮助用户在不了解第一个参数编码和返回值的情况下,间接调用通用内置宏 __FB_QUERY_SYMBOL__,只需向子宏传递 sym 参数,子宏仅返回 -1(真)或 0(假)。

对于三种查询类型,提供了便利专用子宏:

  • '符号类别'(如变量、常量、过程、命名空间等),

  • '数据类别'(如整数、浮点、字符串、UDT 等),

  • '数据类型'(如 boolean、byte、ubyte、short 等)。

用于测试符号是否与所考虑族中的元素匹配。

示例

使用 ./inc/fbc-int/symbol.bi 文件中的便利子宏(间接调用 __FB_QUERY_SYMBOL__

start GeSHi

vb
#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

end GeSHi

直接使用 __FB_QUERY_SYMBOL__./inc/fbc-int/symbol.bi 文件中的部分声明,输出符号的数据类别:

start GeSHi

vb
#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

end GeSHi

直接使用 __FB_QUERY_SYMBOL__./inc/fbc-int/symbol.bi 文件中的部分声明,输出符号的类型名文本、特殊字符替换为 '_' 的类型名文本,以及符号的修饰(名称混淆)类型名(开发中):

start GeSHi

vb
#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

end GeSHi

版本

  • 自 fbc 1.20.0 起:__FB_QUERY_SYMBOL__ 扩展为返回修饰名
  • 自 fbc 1.10.0 起

与 QB 的区别

  • FreeBASIC 新增

返回 目录

基于 FreeBASIC 官方文档翻译 如有侵权请联系我们删除
FreeBASIC 是开源项目,与微软公司无隶属关系