Skip to content

#CMDLINE


预处理器指令

语法

#cmdline "args..."

参数

args...

有效的编译器选项参数列表(以空格分隔),但不包括 -print 和通用选项 -help

说明

#cmdline 是一个预处理器指令,允许在第一个指定的 fb 源文件内部指定编译器选项。第一个源文件是在调用 fbc 编译器的 shell 或 IDE 命令行中给出的第一个 '.bas' 文件。在第一个源文件中指定的 #cmdline 指令会影响随后编译的所有源文件。在第一个源文件之外的源文件中的 #cmdline 指令会被忽略。

#cmdline 只允许在模块作用域中使用,可以通过 #if 预处理器语句进行条件处理。#cmdline 语句必须出现在任何声明性或可执行语句之前。第一个声明性或可执行语句之后的任何 #cmdline 语句都会被忽略。

#cmdline 指令在第一个 '.bas' 源文件的第一遍处理时,按照在源文件中出现的顺序被处理。如果在 #cmdline 语句中给出了无效的命令行选项,编译将立即中止。即使在第二遍处理中条件 #if 会产生不同的结果,#cmdline 指令在第二遍处理时也会被忽略。

fbc 首先按照通常方式初始化,并使用从 shell 或 IDE 的 fbc ... 命令行给出的选项开始解析 fb 源代码。随着 #cmdline 指令被处理,它们会被合并到当前编译器配置中。根据遇到的命令行选项,fbc 可以继续解析、重启解析器或重启 fbc(例如:#cmdline "-mt" 后不重启,#cmdline "-gen gcc" 后重启解析器,#cmdline "-target win64" 后重启构建)。

fbc 没有聪明的方式来检测源代码中所有 #cmdline 指令何时已处理完毕,因此有 2 个伪命令行选项用于在必要时指示 fbc 下一步操作:

#cmdline "-end"

用于在需要时重启解析器或构建的选项。

#cmdline "-restart"

用于始终重启构建的选项。

如果既没有遇到 #cmdline "-end" 也没有 #cmdline "-restart",fbc 将继续处理直到第一个源文件末尾,并在必要时重启。

在 shell/IDE 命令行选项中添加 -z nocmdline 将完全忽略源代码中的 #cmdline 指令,允许用户仅使用 shell/IDE 的 fbc 编译器命令行覆盖所有源代码指令。

在 shell/IDE 命令行选项中添加 -w all 可以获得关于被忽略的 #cmdline 指令的警告。

示例

在源代码中添加一个简单的选项来为 GCC 设置优化级别:

start GeSHi

vb
#cmdline "-O 2"

Print __FB_OPTIMIZE__  '' just to check the optimization level

Sleep

end GeSHi

当 #cmdline 未被处理时(不报告"无效命令行选项"错误消息):

(fbc 解析器在检查 #cmdline 时处于活动状态,因此预期它遵循与任何其他源代码相同的规则)

start GeSHi

vb
'' not processed in single line comments
'#cmdline "asdf"

'' not processed in multi line comments
/'
#cmdline "-asdf"
'/

'' not processed in strings
Print "#cmdline ""-asdf"""

'' not processed if skipping over a conditional
#if 0
   #cmdline "-asdf"
#endif

'' not processed when defining macros (as long as the macro is not called)
#macro DOARGS
   #cmdline "-asdf"
#endmacro

Sleep

end GeSHi

根据实际的 fbc ... 编译器命令行选项在源代码中设置选项:

(根据是否在 fbc ... 编译器命令行中给出了调试选项 '-g' 来激活完整的错误检查)

start GeSHi

vb
'' '-g' command line option given on the real ##//fbc ...//## compiler command line?

#if __FB_DEBUG__
   #cmdline "-exx -w pedantic -w constness"
#endif

end GeSHi

为所有模块定义一个全局符号,从两个模块 main.bas 和 tools.bas 开始,使用单个 '$ fbc main.bas' 编译器命令行编译两者:

(这与在 main.bas 中 #include tools.bas 不同,因为两个模块是分别编译然后链接的)

start GeSHi

vb
'' main.bas
''
'' compile with:
''   $ fbc main.bas
''
'' and will be same as if we did:
''   $ fbc main.bas tools.bas -d DoTrickyStuff

'' add the tools module
#cmdline "-b tools.bas"  '' or: #cmdline "tools.bas"

'' gobal #define for all modules
#cmdline "-d DoTrickyStuff"

Declare Function IsTrickyTools() As Boolean

#ifdef DoTrickyStuff
Print "DoTrickyStuff is defined in the main.bas module"
#endif

If IsTrickyTools() Then
Print "DoTrickyStuff is defined in the tools.bas module"
End If

Sleep

end GeSHi

start GeSHi

vb
'' tools.bas
''

Function IsTrickyTools() As Boolean
   #ifdef DoTrickyStuff
    Return True
   #else
      Return False
   #endif
End Function

end GeSHi

版本

  • 自 fbc 1.09.0 起

与 QB 的区别

  • FreeBASIC 新增

另请参阅

返回 目录

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