tcl语法条件编译
A. TCL编程的语法规则
TCL的语法规则:
1、解释器
在Tcl的数据结构中的核心是Tcl_Interp.一个解释器包含了一套命令,一组变量和一些用于描述状态的东西。每一个 Tcl命令是 在特定的Tcl_Interp中运行的,基于Tcl的应用程序可以同时拥有几个Tcl_Interp。Tcl_Interp是一个轻量级的结构,可以快速的新建和删除。
2、数据类型
Tcl只支持一种数据结构:字符串(string)。所有的命令,命令的所有的参数,命令的结果,所有的变量都是字符串。请牢记这一点,所有的东西都是字符串。这是它比较有特点的方面字符串有三种形式:命令(command),表达式(expresion)和表(list)。
3、Basic Command Syntax 基本语法
Tcl有类似于shell和lisp的语法,当然也有许多的不同。一 条Tcl的命令串包含了一条或多条命令用换行符或分号来隔开,而每一条命令包含了一个域(field)的集合,域使用空白分开的,第一个域是一个命令的名字,其它的是作为参数来传给它。
例如:
set a 22 //相当于C中的 a=22 a是一个变量这条命令分为三个域:1:set 2:a 3:22 set使用于设置变量的值的命令,a、20 作为参数来传给它,a使它要操作的变量名,22是要付给的a值。
Tcl的命令名可以是内置的命令也可以是用户建的新命令,如果是用户用户建的新命令应用程序中用函数Tcl_CreateCommand来创建。所有的参数作为字符串来传递,命令自己会按其所需来解释的参数的。命令的名字必须被打全,但 Tcl解释器找不到一同名的命令时会用 unknown命令来代替。
在很多场合下,unknown 会在库目录中搜寻,找到一个的话,会自动生成一个Tcl命令并调用它。unknown经常完成缩略的命令名的执行。但最好不要使用。
4、注释
和shell很象,第一个字母是"#"的Tcl字符串是注释。
其他细节规则
Grouping arguments with double-quotes 用双引号来集群参数,目的在于使用有空白的参数。
例如:
set a "this string contains whitespace"
如果一个参数一双引号来开始,该参数会一直到下一个双引号才结束。其中可以有换行符和分号。
Variable substitution with $ 用美元符进行变量替换说白了就是引用该变量。
例如:
set a hello
set b $a // b = "hello" 实际上传给set命令的参数
//是b,"hello"
set c a // b = "a"
Command substitution with brackets 命令子替换(用方括号)
例如:
set a [set b "hello"]
实现执行 set b "hello" 并用其结果来替换源命令 中的方括号部分,产生一条新命令
set a "hello" //"hello" 为 set b "hello" 的返回值
最终的结果是b="hello" a="hello"
当命令的一个子域以方括号开始以方括号结束,表示要进行一个命令子替换。并执行该子命令,用其结果来替换原命令中的方括号部分。方括号中的部分都被视为Tcl命令。
如下一个复杂一点的例子:
set a xyz[set b "abc"].[set c "def"]
//return xyzabcdef
Backslash substitution 转移符替换
转移符时间不可打印字符或由它数意义的字符插入进来。这一概念与C语言中的一样。
Backspace (0x8).
f Form feed (0xc).
Newline (0xa).
Carriage-return (0xd).
Tab (0x9).
v Vertical tab (0xb).
{ Left brace (`{").
} Right brace (`}").
[ Open bracket (`[").
] Close bracket (`]").
$ Dollar sign (`$").
sp Space (` "): does not terminate argument.
; Semicolon: does not terminate command.
" Double-quote.
Grouping arguments with braces 用花扩括号来集群参数
用花扩括号来集群参数与用双引号来集群参数的区别在于:用花扩括号来集群参数其中的三种上述的子替换不被执行。而且可以嵌套。
例如:
set a {xyz a {b c d}}//set收到两个参数 a "xyz a {b c d}"
eval {
set a 22
set b 33
}//eval收到一个参数 "set a 22
set b 33"
5、命令综述
1.一个命令就是一个字符串(string)。
2.命令是用换行符或分号来分隔的。
3.一个命令由许多的域组成。第一个于是命令名,其它的域作为参数来传递。
4.域通常是有空白(Tab横向制表健 Space空格)来分开的。
5.双引号可以使一个参数包括换行符或分号。三种子替换仍然发生。
6.花括号类似于双引号,只是不进行三总体换。
7.系统只进行一层子替换,机制替换的结果不会再去做子替换。而且子替换可以在任何一个域进行。
8.如果第一个非控字符是`#",这一行的所有东西都是注释。
6、表达式
对字符串的一种解释是表达式。几个命令将其参数按表达式处理,如:expr、for 和 if,并调用Tcl表达式处理器(Tcl_ExprLong,Tcl_ExprBoolean等)来处理它们。其中的运算符与C语言的很相似。
!
逻辑非
* / % + -
< >>
左移 右移 只能用于整数。
> = == !=
逻辑比较
& ^ |
位运算和 异或 或
&&''
逻辑"和" "或"
x y : z
If-then-else 与C的一样
Tcl 中的逻辑真为1,逻辑假为0。
一些例子:
5./ 4.0
5./ ( [string length "abcd"] + 0.0 )
计算字符串的长度 转化为浮点数来计算
"0x03" > "2"
"0y" < "0x12"
都返回 1
set a 1
expr $a+2
expr 1+2
都返回 3
B. 在windows下如何把tcl编译为tbc文件
段错误的出现一般是出现了空指针情况,可能出现的问题是:你在定义变量或者指针的时候没有初始化,或者你的函数返回值是空值等等,你可以采用gdb调试,可以定位到出错的地方,进行修改。
这类错误是非语法错误,因此修正起来比较困难!
希望能帮到你~谢谢采纳~~~
C. C语言条件编译
#ifdef MAIN_REGS
#define _EXTERN //把_EXTERN定义为空,就是_EXTERN啥也不表示
#else
#define _EXTERN extern //把_EXTERN定义为extern
#endif
不定义MAIN_REGS的时候,_EXTERN被定义为关键字extern
下面程序就变成
extern volatile struct
{
enum _DispSt State;
u8 Time;}
sDisp;
extern 的定义,extern 表示一个声明,定义在其他地方
所以编译器认为你只是在声明一个变量,如果你没有额外在其他文件内定义sDisp
肯定是要报错了
extern的含义请参考http://ke..com/link?url=9EVDWx7LdQeWITokvsRzSCc_ouvquAo-
D. tcl是什么意思
是TCL集团股份有限公司(简称TCL或TCL集团);
TCL集团股份有限公司,创立于1981年,集团现有数万名员工,二十几个研发中心,十余家联合实验室及二十几个制造加工基地,在八十多个国家和地区设有销售机构,业务遍及全球160多个国家和地区。
TCL的前身是我国首批13家合资企业之一的TTK家庭电器(惠州)有限公司,主要从事录音磁带的生产和制造。后来,才逐渐往生产电话、电视、手机、冰箱、洗衣机、空调、小家电、液晶面板等领域转化。
(4)tcl语法条件编译扩展阅读:
TCL集团技术创新体系简介:
TCL 集团是同时拥有电子、移动通讯及8.5 代液晶面板业务的企业,公司通过资源整合,在智能化产品、云计算和网络化技术应用、操作系统及应用软件、新型显示技术等方面均有涉猎;
TCL集团工业研究院直属于TCL集团总部,既是TCL集团的中央研发部门,也是TCL集团核心技术的孵化基地。
研究院围绕“3C融合数字家庭系统及基础软件平台研发”和“新型显示技术”两大战略方向,在智能终端技术、数字视频与算法、基础软件技术平台、云架构与云计算、创新型产品与服务等方面,都有研究。
2018年,TCL荣获福布斯2018年全球最佳雇主榜单;
2019年,TCL进入2019年中国500强企业排行榜单中,同时,也在2019年中国战略性新兴产业领军企业100强榜单中出现。
E. tcl是什么意思
一、工具命令语言
tcl指工具命令语言(Tool Command Language),是一门有编程特征的解释语言,可在 Unix、Windows 和 Apple Macintosh 操作系统上跨平台运行。
二、电器公司
TCL集团股份有限公司,从事录音磁带的生产制造,后来拓展到电话、电视、手机、冰箱、洗衣机、空调、小家电、液晶面板等领域。2019年12月18日,人民日报“中国品牌发展指数”100榜单排名第46位。
(5)tcl语法条件编译扩展阅读
在工具命令语言中,TCL经常被用于快速原型开发,脚本编程,GUI和测试等方面。TCL念作“踢叩” tickle。Tcl的特性包括任何东西都是一条命令,包括语法结构(for, if等);任何事物都可以重新定义和重载;所有的数据类型都可以看作字符串。
在电器公司领域,1992年,研制生产TCL王牌大屏幕彩电,投放市场一炮走红。同时,着手导入CI系统,成为国内较早实施CIS的国有企业之一。1993年,TCL将品牌拓展到电工领域,成立TCL国际电工(惠州)有限公司。
F. tcl 语法基础
注释:
puts {Hello, World - In Braces}; # 这种注释方式才是正确的
puts {Bad comment syntax example} # *Error* - there is no semicolon!这是一个错误,因为tcl的语法规定,命令的参数结束的方式为;或者新的一行
变量:
初始化一个变量用set关键字:
# set关键字可以接受两个参数:并返回第一参数(也就是变量名)的内容(第二个参数)
#set关键字也可以接受一个参数,如果只接受一个参数的时候返回这个变量的内容
set x 10 # 定义变量x的值为10
set y x+100 # 定义变量y的值为 x+100 这里会把x+100 看成整体的一个字符串,这里可以看出tcl默认都认为是字符串来出来
set y $x+100 # 定义变量y的值为 10+100 ,这里$符号告诉解释器x是一个变量而不是字符串
set y [expr $x+100] # 定义变量y的值为110,当tcl解释器遇到[] 的时候会去执行里面的内容并返回结果。
set y "$x ddd" # 这里双引号的作用是允许这个字符串中有空格
set y {$x 10} # 这里的x不会被解释,所以{}的作用是,直接定义 一整串字符串
puts:转义符
set Z Albany
set Z_LABEL "The Capitol of New York is: "
puts "$Z_LABEL $Z" ;# Prints the value of Z
puts "$Z_LABEL \$Z" ;# Prints a literal $Z instead of the value of Z
puts "\nBen Franklin is on the \$100.00 bill"
set a 100.00
puts "Washington is not on the $a bill" ;# This is not what you want
puts "Lincoln is not on the $$a bill" ;# This is OK
puts "Hamilton is not on the \$a bill" ;# This is not what you want
puts "Ben Franklin is on the \$$a bill" ;# But, this is OK
puts "\n................. examples of escape strings"
puts "Tab\tTab\tTab"
puts "This string prints out \non two lines"
puts "This string comes out\
on a single line"
数组:
set a [list 1 2 3 4] # 初始化一个列表
lappend a 5 # 追加一个变量,注意这里的列表a没有加$
lindex $a 1 # 获取列表第二值,这里加上了$
llength $a # 返回列表的长度
lrange $a 0 2 # 返回前三个数这里取到了第三个值
字符串格式化:
set name john
set age 20
set msg [format "%s is %d years old" $name $age] # 格式化
puts $msg
G. 有关Tcl脚本语言编程的问题
set srcfile myres.res
set dstfile dtest.txt
if {[catch {open $srcfile r} res]} {
puts "Failed to open the source file: $srcfile; $res"
return 0
}
set hSrc $res
if {[catch {open $dstfile w+} res]} {
puts "Failed to open the destination file: $dstfile; $res"
return 0
}
set hDst $res
foreach line [split [read $hSrc] \n] {
if {[regexp {rdly=(.*)targ=(.*)trig=(.*)} $line match sub1]} {
puts $hDst "Rise Delay is $sub1"
}
if {[regexp {fdly=(.*)targ=(.*)trig=(.*)} $line match sub1]} {
puts $hDst "Fall Delay is $sub1"
}
}
close $hSrc
close $hDst