导航:首页 > 源码编译 > 编译器窗口输入字符串有下划线

编译器窗口输入字符串有下划线

发布时间:2024-08-11 02:25:09

‘壹’ C++函数重载的编译后的一个奇怪的问题

是的,对于编译器来说,名字是不一样而且唯一的,编译器会对函数名“修饰”。


classCTest
{
......
private:
voidFunction(int);
protected:
voidCopyInfo(constCTest&src);
public:
longDrawText(HDChdc,longpos,constTCHAR*text,RGBQUADcolor,BYTEbUnder,boolbSet);
longInsightClass(DWORDdwClass)const;
......
};

对于成员函数Function,其函数修饰名为“?Function@CTest@@AAEXH@Z”,字符串“@@AAE”表示这是一个私有函数。成员函数CopyInfo只有一个参数,是对类CTest的const引用参数,其函数修饰名为“?CopyInfo@CTest@@IAEXABV1@@Z”。DrawText是一个比较复杂的函数声明,不仅有字符串参数,还有结构体参数和HDC句柄参数,需要指出的是HDC实际上是一个HDC__结构类型的指针,这个参数的表示就是“PAUHDC__@@”,其完整的函数修饰名为“?DrawText@CTest@@QAEJPAUHDC__@@JPBDUtagRGBQUAD@@E_N@Z”。InsightClass是一个共有的const函数,它的成员函数标识是“@@QBE”,完整的修饰名就是“?InsightClass@CTest@@QBEJK@Z”。

‘贰’ c++中的_T是什么意思

在c++中是引用,直接使用你输入的参数,T就是你输入参数的另外一个名字

‘叁’ 编译器笔记34-中间代码生成-布尔表达式的回填

基本思想:生成一个跳转指令时,暂时不指定该跳转指令的目标标号。这样的指令都被放入由跳转指令组成的列表中。同一个列表中的所有跳转指令具有相同的目标标号。等到能够确定正确的目标标号时,才去填充这些指令的目标标号。

B.truelist:指向一个包含跳转指令的列表,这些指令最终获得的目标标号就是当B为真时控制流应该转向的指令的标号。

B.falselist:指向一个包含跳转指令的列表,这些指令最终获得的目标标号就是当B为假时控制流应该转向的指令的标号。

为了处理衫芹跳转指令的列表我们构造了三个函数

上述的布尔表达式将被翻译成两条跳转指令。两条跳转指令的标号都不填写因为这两条跳转指令的标号都在等待回填,因此我们要把它放到相应的列表中。

第一条跳转指令的目标标号是B的真出口,因此我们把它放到B.truelist中。调用makelist函数生成一个只包含nextquad的列表,并把这个列表的指针赋值给truelist,这里的nextquad是指即将生成的下一条指令的标号或瞎毕,即gen('if' E1.addr relop E2.addr'goto_')这条指令的标号。

第二条跳转指令的目标标号是B的假出口,因此把这条跳转指令存放到B.falselist中。因此我们调用makelist函数生成一个只包含nextquad+1这样一个标号的列表,nextquad+1标号就是gen('goto_')这条指令的标号。

这样的话我们就将这两条指令分别放入到B.truelist和B.falselist中。

问:list中存的是对应跳转指令的标号?

当B定义为true时,此时可以确定布尔表达式的值为真,生成一条跳转到B的真出口的一条指令。由于此真出口的标号不能确定有待回填,我们把它放入到B.truelist中。

当B定义为false时,此时可以确定布尔表达式的值为假,生成一条跳转到B的假出口的一条指令。由于此真出口的标号不能确定有待回填,我们把它放入到B.falselist中。

对B的翻译与其对应的子表达式B1的翻译是相同的,因此B的属性值等于B1的属性值。

B的值与B1的值正好相反,因此将两个非终结符的属性进行对调。

B1.truelist中的这些指令都要跳转到B1的真出口,当B1为真的时候整个表达式的值就是为真的,因此B1的真出口就是B的真出口。要跳转到B1的真出口就是跳转到B的真出口,因此B1.truelist中的指令都要放到B.truelist中。

B2.truelist的指令都要跳转到真出口,当B2为真时整个表达式的值也为真,因此B2的真出口就是B的真出口。要跳转到B2的真出口就是要跳转到B的真出口,因此B2.truelist中的指令都要放到B.truelist中。

B1.falselist中的指令它们都是要跳转到B1的假出口,当B1的值为假的时候我们要进一步判断B2的值,因此B1的假出口就是B2的第一条指令,因此B1.falselist中的指令都要跳转到B2的第一条指令。

B2.falselist中的指令都要跳转到B2的假出口,当B2的值为假的时候那么整个布尔表达式的值也是假的。因此B2的假出口就是B的假出口,要跳转到B2的假出口也就是要跳转到B的假出口。B2.falselist中的指令都要放置到B.falselist中。

根据此示意神前图可以看出,在分析B2之前,要用B2的第一条指令的标号来回填B1.falselist中的各条指令。当然我们可以记录下B2的第一条指令的标号在归约时完成此回填动作。为了记下B2第一条指令的标号我们在非终结符B2之前插入一个标记非终结符M。与M关联的语义动作它的任务就是记录下B2的第一条语义动作的标号。我们给M设置一个综合属性quad,M.quad等于下一条指令的标号。因为我们把M放在B2之前,因此M.quad记录的是第二条指令的标号。根据翻译方案示意图,我们要用M.quad来回填B1.falselist中的各条指令,因此调用backpatch用M.quad回填B1.falselist中的各条属性。B.truelist是由B1.truelist和B2.truelist合并而成的,因此我们调用merge函数将B1.truelist和B2.truelist进行合并,将合并后的指针赋值给B.truelist。

注:因为这里我们定义的都是综合属性,从左向右扫描输入串。makelist函数生成一个只包含下一条指令的列表,并把指针赋值给B.trulist。我们假设下一条指令从100开始。gen(‘if ’ E 1 .addr relop E 2 .addr ‘goto _’)中E1.address等于a,relop就是小于号,E2.address等于b,引号中的字符串按字面值传递。下划线表示待回填的目标标号。

注:将栈顶中的空串归约成一个标记非终结符M

注:有四条指令是等待回填的,在B的truelist中有两条指令100和104,当B的真出口确定以后我们将用B的真出口的标号这两条指令。同理当B的假出口确定以后将会用B的假出口的标号回填此两条指令。

阅读全文

与编译器窗口输入字符串有下划线相关的资料

热点内容
共享文件夹不显示任务栏 浏览:251
唱歌给党听是哪个app的活动 浏览:499
bp算法源代码 浏览:648
发票服务器怎么选 浏览:387
哪个app陪伴运动 浏览:882
学编程每天六点起床 浏览:954
乌鸦搜索算法复现 浏览:77
android3d切换 浏览:751
资源管理器选定文件夹 浏览:989
分数公约数的算法 浏览:589
yii2引入php文件 浏览:564
华为p20方舟编译器评测 浏览:187
pntp服务器是什么 浏览:654
程序员培训多长时间 浏览:557
求aaa的和python 浏览:194
python因子分析代码 浏览:647
python启动时提示没有入口 浏览:681
linux中oracle监听 浏览:622
程序员高价值朋友圈 浏览:489
云服务器做淘宝店 浏览:805