易截截图软件、单文件、免安装、纯绿色、仅160KB

编译出来的c/c++程式的参数压栈顺序只和编译器相关!

下面列举了一些常见的编译器的调用约定
VC6:
调用约定        堆栈清除    参数传递
__cdecl         调用者      从右到左,通过堆栈传递
__stdcall       函数体      从右到左,通过堆栈传递
__fastcall      函数体      从右到左,优先使用寄存器(ECX,EDX),然后使用堆栈
thiscall        函数体      this指针默认通过ECX传递,其他参数从右到左入栈
__cdecl是C\C++的默认调用约定; VC的调用约定中并没有thiscall这个关键字,他是类成员函数默认调用约定;
C\C++中的main(或wmain)函数的调用约定必须是__cdecl,不允许更改;
默认调用约定一般能够通过编译器配置进行更改,假如您的代码依赖于调用约定,请明确指出需要使用的调用约定;
 
C++Builder6:
调用约定        堆栈清除    参数传递
__fastcall                 函数体      从左到右,优先使用寄存器(EAX,EDX,ECX),然后使用堆栈 (兼容Delphi的register)
(register和__fastcall等同)
__pascal                   函数体      从左到右,通过堆栈传递
__cdecl                    调用者    从右到左,通过堆栈传递(和C\C++默认调用约定兼容)
__stdcall                  函数体      从右到左,通过堆栈传递(和VC中的__stdcall兼容)
__msfastcall               函数体      从右到左,优先使用寄存器(ECX,EDX


相关文档:

VB/C++/C#串口通讯源代码【附详细注释】


VB
    If MSComm1.PortOpen = True Then MSComm1.PortOpen = False
    MSComm1.CommPort = i1
    MSComm1.PortOpen = True
    MSComm1.InputMode = comInputModeBinary
    MSComm1.InBufferCount = 0
& ......

C++中使用sqlite

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include ".\sqlite3_lib\sqlite3.h"
 
static int _callback_exec(void * notused,int argc, char ** argv, char ** aszColName)
{
    int i;
    for ( i=0; i<argc; i++ )
   ......

C备忘录之六——#pragma预处理

#pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。
#pragma 指令对每个编译器给出了一个方法,在保持与C 和C ++语言完全兼容的情况下,给出主机或操作系统专有的特征。
依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的。
一、#pragma message
#pragma ......

Python 中的函数调用(类似c中的使用函数入口地址)

def login():
    print 'login'
def logout():
    print 'logout'
controllers = {
'in': login,                              ......

使用C/C++运行时库函数操作线程

Visual Studio包含了4个本机C/C++运行时库和2个用来管理MS.NET的C/C++运行时库。所有这些库都支持多线程编程环境:目前已经没有专门为单线程开发设计的C/C++运行时库了。表6-1对这些库进行了描述:
Libray Name
Description

LibCMt.lib
Statically linked release version of the library.
Lib ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号