#CMDLINE
- 来源: https://www.freebasic.net/wiki/wikka.php?wakka=KeyPgPpcmdline
- 最后更新: 2022-06-04
预处理器指令
语法
#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
#cmdline "-O 2"
Print __FB_OPTIMIZE__ '' just to check the optimization level
Sleepend GeSHi
当 #cmdline 未被处理时(不报告"无效命令行选项"错误消息):
(fbc 解析器在检查 #cmdline 时处于活动状态,因此预期它遵循与任何其他源代码相同的规则)
start GeSHi
'' 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
Sleepend GeSHi
根据实际的 fbc ... 编译器命令行选项在源代码中设置选项:
(根据是否在 fbc ... 编译器命令行中给出了调试选项 '-g' 来激活完整的错误检查)
start GeSHi
'' '-g' command line option given on the real ##//fbc ...//## compiler command line?
#if __FB_DEBUG__
#cmdline "-exx -w pedantic -w constness"
#endifend GeSHi
为所有模块定义一个全局符号,从两个模块 main.bas 和 tools.bas 开始,使用单个 '$ fbc main.bas' 编译器命令行编译两者:
(这与在 main.bas 中 #include tools.bas 不同,因为两个模块是分别编译然后链接的)
start GeSHi
'' 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
Sleepend GeSHi
start GeSHi
'' tools.bas
''
Function IsTrickyTools() As Boolean
#ifdef DoTrickyStuff
Return True
#else
Return False
#endif
End Functionend GeSHi
版本
- 自 fbc 1.09.0 起
与 QB 的区别
- FreeBASIC 新增
另请参阅
返回 目录