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。
本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/farsky16/archive/2006/05/06/711066.aspx
相关推荐
linux编译器使用总结(1)编辑器,编译器,gcc
编辑器 用了好久的linux,也逐渐习惯编辑器的使用,相比较使用ide写代码的确不是很“方便”,但看网上说,使用编辑器久了,就会大大提升。 我当初使用编辑器时,纠结过纯文本编辑器和图形化编辑器。最终还是选择了vim(系统自带) Emacs和Vim使用上差不多。 一开始在vimrc上粘贴一些命令来方便我敲代码,后来实在嫌弃麻烦,直接妥妥的,下一个插件,我的vim已经感觉在编译,敲代码上...
VC编译器与GCC编译器的区别
首先,所谓语法区别是针对程序设计语言而言的,这里首先你要分清楚它们之间的区别。 Gcc:它是一款开源的C语言编译器,原来只能在Linux系统上使用,后来移植到了Windows操作系统上,以此为基础的编译环境典型的又MinGW。 它不是编程语言,所以没有语法这一说。G++:和GCC一个性质,只不过它是针对C++语言的。 VC:它有两种解释: 1.即VC本身,是微软公司推出的一款C++编译器,Visu...
计算机组成原理课题讨论——编译器对程序的影响
1.编译效率 2.语法格式支持度 3.程序的输出 4.编译器对程序的优化
查找变量类型的范围和字节大小
编程时经常需要知道各种字符型变量、整型变量的范围和占用的字节大小,各种编译器可能会略有区别,因此可以通过将头文件包含进来进行查找。 如下: #include <stdio.h> #include <limits.h> main() { int a; printf("The value of INT_MAX is %i\n", INT_MAX); print...
GCC和VC在定义结构时的区别及编程示例
综上所述,GCC和VC在定义结构时的区别在于访问结构成员的操作符不同。开发人员在编写跨平台的代码时应该注意这些差异,并根据所使用的编译器选择正确的操作符来访问结构成员。在上面的示例中,我们定义了一个指向Person结构的指针person,并使用箭头操作符访问结构中的成员。需要注意的是,在使用箭头操作符之前,我们需要先使用malloc函数为结构体分配内存空间,并在使用完后使用free函数释放内存。希望本文能对你理解GCC和VC在定义结构时的区别有所帮助,并通过提供的编程示例加深你对这一概念的理解。
嵌入式状态机编程-QP状态机框架与常见状态机方法
状态机基本术语 现态:是指当前所处的状态。 条件:又称为“事件”,当一个条件被满足,将会触发一个动作,或者执行一次状态的迁移。 动作:条件满足后执行的动作。动作执行完毕后,可以迁移到新的状态,也可以仍旧保持原状态。动作不是必需的,当条件满足后,也可以不执行任何动作,直接迁移到新状态。 次态:条件满足后要迁往的新状态。“次态”是相对于“现态”而言的,“次态”一旦被激活,就转变成新的“现态”了。 传统有限状态机Fsm实现方法 如图,是一个定时计数器,计数器存在两种状态,一种为设置状态,一种为计时状态 设
C语言中,数字后面带个U,L,F的含义
原文链接:https://blog.youkuaiyun.com/qq_42820594/article/details/82735387。F,L,U 等价于 f,l,u。数值后面加“L”和“l”(小写的l)的意义是该数值是long型。数值后面加“U”和“u”的意义是该数值是unsigned型。数值后面加“”H“、“h”的意义是该数值是用16进制表示的。数值后面加“”B“、“b”的意义是该数值是用2进制表示的。数值前面加“0x”的意义是该数值是十六进制。数值前面加“0”的意义是该数值是八进制。
SVM-支持向量机学习(1):线性可分SVM的基本型
1. foreword先看的是李航老师的书第7章,比较传统按照以下三节展开: 线性可分SVM 线性SVM 非线性SVM SMO算法 李航老师讲东西向来不拖泥带水,但本节也几乎用了40页的篇幅,足见涉及内容之多。7月底硬着头皮啃了下来,边看边在笔记上摘抄标注,花了2天时间对SVM有了基本认识。一个月过去了,如今重新整理为博客,再看轻松许多,并不断对比西瓜书的内容,启望达到融会贯通。西瓜书此节明显节奏轻
gcc和vc编译器在语法上的比较(转)
<br /> gcc编译器的功能强大,支持的语法也非常灵活,给我们在编程时带来了非常大的方便,也给移植代码时带来了一定的难度。 <br /> 1 声明64位数据类型:<br /> gcc: long long<br /> vc: __int64 2 switch语法中的case语句:<br /> gcc: case '0' ... '9'<br /> vc: case 0: case1: ... 3 寄存器变量的作用范围:<br /> gcc: 可以把regi
汇率波动率建模实战:从GARCH到EGARCH的金融时间序列分析
在金融时间序列分析中,波动率建模是量化市场风险的核心技术。其基本原理在于捕捉金融资产收益率序列中存在的波动聚集、尖峰厚尾等典型特征。通过建立条件异方差模型,如GARCH及其扩展模型,可以动态估计和预测未来波动率,这对于资产定价、风险管理和投资决策具有重要价值。在金融工程领域,该技术广泛应用于外汇、股票和衍生品市场。本文以汇率波动率建模为具体场景,详细阐述了如何使用Python中的arch库,从数据预处理、模型选型(包括GARCH、EGARCH等)、参数估计到样本外预测评估的全流程实践,并深入探讨了模型在应对
MATPOWER下载安装教程
将MATPOWER文件复制在C:\Program Files (x86)\MATLAB\R2016b\bin目录下。原来的窗口中多了很多文件路径,点击【保存】,再点击【关闭】选择所要添加的MATPOWER文件夹,点击【选择文件夹】二、将MATPOWER放在bin目录下。找到菜单栏的【设置路径】点击【添加并包含子文件】一、从官网下载后解压。
(转)gcc编译与vc编译器区别
gcc编译器的功能强大,支持的语法也非常灵活,给我们在编程时带来了非常大的方便,也给移植代码时带来了一定的难度。1 声明64位数据类型:gcc: long longvc: __int642 switch语法中的case语句:gcc: case '0' ... '9'vc: case 0: case1: ...3 寄存器变量的作用范围:gcc: 可以把regis...
用FPGA控制步进电机是种什么体验?从状态机到分频器,详解Verilog驱动A4988全流程
本文详细介绍了如何使用FPGA通过Verilog语言控制步进电机,从状态机设计到A4988驱动模块的精准控制全流程。FPGA的并行处理能力和纳秒级响应速度使其在步进电机控制中展现出显著优势,特别适合工业自动化和精密仪器应用。通过实战代码示例,展示了如何实现高效的状态机设计和可编程分频器,为开发者提供了一套完整的FPGA驱动步进电机解决方案。
linux中类似vc的编译器,gcc编译与vc编译器区别
gcc编译器的功能强大,支持的语法也非常灵活,给我们在编程时带来了非常大的方便,也给移植代码时带来了一定的难度。1 声明64位数据类型:gcc: long longvc: __int642 switch语法中的case语句:gcc: case '0' ... '9'vc: case 0:case1:...3 寄存器变量的作用范围:gcc: 可以把register变量声明为全局或局部的vc: 只能是...
首发!谷歌倾斜摄影数据转换生成OSGB格式
全球首发,谷歌倾斜摄影模型文件能直接转换成OSGB格式!
含分布式电源的配电网三段式电流保护影响仿真研究
文章摘要 本文研究了分布式电源(DG)接入对配电网三段式电流保护的影响。通过在Matlab/Simulink平台搭建含同步发电机型DG的10kV配电网模型,设计了基于傅里叶算法的三段式电流保护模块(I段瞬时速断、II段限时速断、III段定时限过流)。研究分析了不同DG接入位置、容量及故障点对保护系统的影响机理。仿真结果表明,DG接入会改变故障电流特性,可能导致三种典型问题:保护范围扩大引起误动、保护灵敏度下降导致拒动,以及保护选择性丧失。该研究为含DG配电网的保护配置与整定提供了理论依据和仿真参考,对保障分
gcc编译与vc编译器区别
gcc编译器的功能强大,支持的语法也非常灵活,给我们在编程时带来了非常大的方便,也给移植代码时带来了一定的难度。 1 声明64位数据类型:gcc: long longvc: __int64 2 switch语法中的case语句:gcc: case '0' ... '9'vc: case 0:...
YOLOv11目标检测模型性能评价指标详解,涉及混淆矩阵、F1-Score、IoU、mAP、参数量、计算量等,一文打尽所有评价指标
本文主要讲解的是计算机视觉网络模型的性能评价指标,这是每一篇论文中都需要展示的内容。熟悉每一个评价指标也能够帮助我们在训练和改进模型过程中,更好的观察模型的变化效果。
关于VC和GCC中调用C DLL的一些问题
原文地址:https://blog.youkuaiyun.com/funkri/article/details/8550290 关于VC和GCC中调用C DLL的一些问题 最近在罗云彬的琢石成器上看到DLL部分,产生了让GCC和VC互相调用对方产生的DLL的想法。由于C++的函数名改编问题,其dll不具有二进制级别的共享性,也就是说VC和GCC的C++ dll不能混用,但C的可以。我试验了一下,使用VC和GCC分别生成了一个简单的DLL然后由对方调用,结果可以成功,另外还顺带完成了一个DLL导出lib和a的脚本..
计算机控制技术及应用
《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。
C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片
基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正
windows下安装,配置gcc编译器
在Windows下使用gcc编译器: 1.首先介绍下MinGW MinGW是指只用自由软件来生成纯粹的Win32可执行文件的编译环境,它是Minimalist GNU on Windows的略称。 实际上 MinGW 并不是一个 单纯的C/C++ 编译器,而
复分析 阿尔福斯(Ahlfors) 第三版答案 英文
答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案
VC内联汇编和GCC内联汇编的语法区别
VC: #include <stdio.h> main(){ int a = 1; int b = 2; int c; __asm{ mov eax,a mov ebx,b mov ecx,1h ...
发现VC编译器和gcc编译器的一点不同
今天看书,敲代码结果发现了两种编译器在编译相同的代码时的一点不同记下来。 代码: #include #include template T const& max(T const& a, T const& b){ return a < b ? b : a;}int _tmain(int argc, _TCHAR* argv[]){
VC & GCC(一)
VC8.0 & gcc version 3.4.2 (mingw-special)// 标准的兼容性相关// 模板特化相关//VC8 templatestruct VC8{}; template{}; VC8 vc8_0; VC8 vc8_1;//OK//GCC templatestruct GCC{}; template{};//LOST, Try Like This te
C++类的大小在GCC和VC上的区别
c++ ,类的大小,虚继承和多继承
1207



被折叠的 条评论
为什么被折叠?



