gcc编译器的功能强大,支持的语法也非常灵活,给我们在编程时带来了非常大的方便,也给移植代码时带来了一定的难度。

1 声明64位数据类型:
gcc: long long
vc: __int64

2 switch语法中的case语句:
gcc: case '0' ... '9'
vc: case 0:
     case1:
      ...

3 寄存器变量的作用范围:
gcc: 可以把register变量声明为全局或局部的
vc: 只能是局部变量

4 有符号和无符号整形:
gcc: 在常量数字后面加LL或ULL,例如:
无符号:0xffffffffffffffffULL
有符号:0xffffffffffffffffLL
vc: 在常量数字前加强制转换。例如:
无符号:(uint64_t)0xffffffffffffffff

5 宏变参
gcc: #define AAA(x...)
vc: 不支持,在实际中碰到此类问题时只能根据代码分析实际情况将它分解成若干个宏

6 对数组中指定元素的初始化:
gcc: static int array[100] = {
      [10] = 10, /* array[10] = 10; */
      [20] = 20, /* array[20] = 20; */
}
功能:通过这种方法,可在数组的声明当中就初始化指定元素的值,除了arrar[10]和array[20]外,其余元素会自动初始化为默认值,这给我们带来了一种很简捷的办法,这功能是不是很酷?

vc: 不支持,只能通过在指定元素前后填充0或另外写一个初始化函数来实现。如初始化函数可以这样写:
void init_array()
{
array[10] = 10;
array[20] = 20;
}

7 结构体的对齐:
 先解释一下如下几个属性关键字的含义:
1    属性 packed: 用于变量和类型,表示变量或结构域时使用最小可能的对齐,用于枚举、结构或联合类型时表示该类型使用最小的内存。
2    属性 aligned:用于变量、结构或联合类型,指定变量、结构域、结构或联合的对齐量,以字节为单位。                    
3   属性 noreturn:用于函数,表示该函数从不返回。这可以让编译器生成稍微优化的代码,最重要的是可以消除不必要的警告信息比如未初使化的变量。
4   属性 unused:用于函数和变量,表示该函数或变量可能不使用,这个属性可以避免编译器产生警告信息。
      如上这些关键字在gcc和vc中都是相对应的,只是使用的方法不一样。注意:vc必须装了service pack补丁后才支持。  

gcc:
struct __attribute__((packed)) st_syment
{
...
}

vc:
#pragma pack(push,1)
struct st_syment
{
...
}
#pragma pack(pop)
表示在这个结构体的元素是按字节对齐的。

gcc: __attribute__((aligned(16)))
vc: __declspec(align(16))
表示创建此结构体实例时按16字节对齐。

gcc: __attribute((noreturn))
vc: __declspec(noreturn)
表示此函数不需要返回。

8 得到当前函数的返回地址,就是这个函数被调用处的下条指令地址。例如:
push edx
call _func /* 调用名为func函数 */
pop edx
而在func()函数中又有这样一条语句:
void func()
{
...
retaddr = __builtin_return_address(0); /* 此条语句执行后,retaddr的值应该是上面pop edx指令的地址 */
...
}

gcc: retaddr = __builtin_return_address(0)
vc: __asm { mov eax, [ebp+4] }
     __asm { mov retaddr, eax }
      我们知道,cpu执行一条指令时,eip总是指向下一条指令地址的,在调用一个函数前,就会先把eip入栈,以便函数返回后继续执行后面的指令,也就是说,在进入函数之前,栈顶(esp)的值就是eip了,所以我们就可以根据这个思路来解决。在vc编译后生成的汇编代码中,每个函数头部都有这样两条指令:
      push ebp
      mov ebp, esp
     就是将原来的esp放到ebp中了,加上前面一句push ebp,而压栈的顺序又是由高到低的,所以[ebp+4]就等于函数被调之前的eip。

转载于:https://my.oschina.net/alphajay/blog/6739

gcc编译与vc编译器区别相关推荐

  1. (转)gcc编译与vc编译器区别

    gcc编译器的功能强大,支持的语法也非常灵活,给我们在编程时带来了非常大的方便,也给移植代码时带来了一定的难度. 1 声明64位数据类型: gcc: long long vc: __int64 2 s ...

  2. VC编译器与GCC编译器的区别

    首先,所谓语法区别是针对程序设计语言而言的,这里首先你要分清楚它们之间的区别. Gcc:它是一款开源的C语言编译器,原来只能在Linux系统上使用,后来移植到了Windows操作系统上,以此为基础的编 ...

  3. C++ 笔记(01)— 环境设置(安装g++、g++ 编译 C++、 生成可执行文件流程、解释器与编译器区别)

    1. g++安装 在 Linux 或者 UNIX 系统上,可以通过下面命令来查看是否安装了 GCC . $ g++ -v 如果已经安装 GNU 编译器,则有以下输出: wohu@wohu:~/C++$ ...

  4. 不同的编译器:GCC G++ C C++的区别

    gcc 是c的编译器,g++是c++的编译器.cc一般是一个符号连接,指向gcc.CC一般是makefile里面的一个名字,具体是什么根据实际情况决定. gcc和g++都是GNU(组织)的一个编译器. ...

  5. gcc 编译python_4 个快速的 Python 编译器 for 2018

    简评:Python 和其他的解释型语言一样经常被吐槽性能不行,所以开发人员为了提升性能创建了不少编译器,本文则选取其中的四个做了基准测试. Python 其实是一种相当快的语言,但它并不像编译型语言那 ...

  6. arm 各种 gcc 编译器区别

    做嵌入式开发在以前经常需要下载交叉编译器,主要是因为那个时候的产品绝大多数位 arm架构的,而市面上基本上的 PC/服务器基本上 X86.即便现在 arm架构的笔记本和服务器慢慢推向市场,原由的那套嵌 ...

  7. linux gcc编译c文件头文件,使用GCC编译器编译C语言

    GCC编译C源代码有四个步骤:预处理-->编译-->汇编-->链接. 可以利用GCC的参数来控制执行的过程,这样就可以更深入的了解编译C程序的过程. 下面将通过对一个程序的编译来演示 ...

  8. vc编译器编译linux平台拷贝的源码问题

    最近向windows平台移植一个linux的项目,编译老是出现问题. 具体症状: 在调试运行时,发现反汇编的的代码老是和源码对不上. 原因:linux平台上的文件格式一般是utf-8 无bom的格式, ...

  9. GCC编译工具集和nasm编译器

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一.gcc编译工具集 1.1gcc工具有哪些 1.2gcc编译过程 1.2.1.这里我们是使用一个hello.c文件进行演 ...

  10. gcc编译报错:undefined reference to `std::cout‘

    1 问题描述 下面的一段代码(代码来源)在使用gcc编译的时候报错:undefined reference tostd::cout'` 编译文件:test.cpp内容如下: #include < ...

最新文章

  1. 时间为什么用 12 进制?
  2. 微信拦截网站怎么办 微信屏蔽网址如何正常打开
  3. mysql group by 分组查询
  4. linux 挂载u盘
  5. java 内部类 加载_java内部类及类加载顺序
  6. 关于onreadystatechange属性(转)
  7. QGraphicsScene 的简单理解--关于手册的简要翻译
  8. VisualCode 查看代码历史版本、还原代码到既定历史版本
  9. AndroidStudio_安卓原生开发_AsyncTask异步处理使用_AsyncTaskLoader---Android原生开发工作笔记139
  10. Java运行时出现”the serializable class drawline does not declare a static final serialversio”...
  11. 51nod 1286 三段子串(树状数组+拓展kmp)
  12. 2012网页设计趋势(上)
  13. Windows8 RP版亲手体验全过程
  14. 虚拟机运行win95
  15. 计算机图形学VC 配置,计算机图形学(VC++实现)(第2版)
  16. 微信计算机控制技术试卷,微型计算机控制技术试卷答案A.doc
  17. PreTranslateMessage详解
  18. sql server 入门篇
  19. Java 支付宝手机网站支付下单 支付回调 及订单查询实现
  20. 浏览器渲染类型2d 3d_Google在浏览器中提供3D渲染

热门文章

  1. [Scottgu]ASP.NET vNext系列——数据选择
  2. adapter中的数据错误原因和解决方案
  3. el-tree多选获取选中的节点ID
  4. vue 获取跳转上一页组件信息
  5. 两个app应用之间的跳转
  6. vue 组件 not defined_Vue、Spring Boot开发小而完整的Web前后端分离项目实战10
  7. NLPIR java测试(没找到范例代码)
  8. OFFICE拼写语法检查:WORD是怎么做的?
  9. 全网首发:怎样制作CDKEY(2)-数据构造
  10. 一天到晚都在转笔,不需要写代码、调试,用眼看就行了?