都是一些比较细节的东西,有没有用大家看着办吧。

C/C++技术细节(VC编译器)

1.Jmp stub Function
考虑以下函数:
Void Test(){}
Void main()
{ test();}
在debug情况下,编译后
Void Jmp_Test()
{
    Jmp to Real_test();
}
Void main()
{jmp_test()}
如何让编译器不产生Jmp Stub function。
解决方法,在Link选项中去掉Increment link.

2.自定义节,数据代码合并在一个节
#pragma data_seg(".mydat") //指定该.cpp/.c(其实应该是某个.obj文件) 数据存放的节
注意:Dword a; //  未初始化,数据仍保存在.data节
      Dword a=0; //这样a就保存到.mydat节了
#pragma code_seg(".shell")//指定该.cpp/.c(其实应该是某个.obj文件) 代码存放的节
#pragma comment(linker,"/SECTION:.mydat,RWE") //修改节属性
#pragma comment(linker,"/SECTION:.shell,RWE")
#pragma comment(linker,"/MERGE:.mydat=.shell")//两节合并到.shell节

3.__declspec(naked)声明的函数不能使用局部变量

4.char[]
char test[]=”test”//假定 此处地址为0x4001000
void main()
{
    printf(“%x”,test);
    printf(“%x”,&test);
}//执行以上代码分别输出什么
答案:两个都输出0x4001000,哈哈,没想到吧。

5.char*与char[]
char* test1=”test”;
char test2[]=”test”
考虑下执行该程序会产生什么状况
void main()
{
    test1=”new test”;
    test2=”new test”;
}
考虑下再看答案





编译后是这样的。
atest db ‘test’,0
Test1  dd  offset of attest
Test2 db ‘test’,0
所以test2=”new test”;编译过不了,当然我们仍然能够通过memcpy给test2赋值

6.数据对齐
Word a;
Char str[]=”ddddd”;
Void main()
{
  Printf(”%d”,&str-&a);//输出什么,考虑一下
}
答案:可能输出2,也可能输出4