c++-关于win32 api中宏定义有一处不理解

问题描述

关于win32 api中宏定义有一处不理解

#define KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)

这段代码我知道:宏定义,用KEYDOWN(vk_code)替代((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)

但是不可思议的来了,它直接这样写:

KEYDOWN(VK_UP)

我可以理解这是什么意思,就是说((GetAsyncKeyState(VK_UP) & 0x8000) ? 1 : 0)

但是逻辑上我不能理解的是,宏定义应该是死的吧,怎么可能用得这么“活”,

定义上说是KEYDOWN(vk_code)替代((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)

那就必须只能是KEYDOWN(vk_code)啊,怎么可能换里面的参数然后另一个也换

还可以这样用的?

解决方案

用宏定义来代替函数,这是很常见的做法啊。

解决方案二:

这就是典型的宏函数吗,跟函数差不多,但是没有参数的压栈、出栈操作

时间: 2024-08-30 21:43:08

c++-关于win32 api中宏定义有一处不理解的相关文章

c++-C++中宏定义比较两个数的大小

问题描述 C++中宏定义比较两个数的大小 #include #define max(a,b) ((((long int)((a)-(b)))&0x80000000)?b:a) void main() { int t,a,b; cout<<"output a,b"< cin>>a,b; t=max(a,b); cout<<t<<endl; }为什么运行结果老是a的值? 解决方案 ((((long int)((a)-(b)))&

c语言-c中这个定义的形参怎么理解,int型的什么呢

问题描述 c中这个定义的形参怎么理解,int型的什么呢 如果是在程序中那么int &a就是a的地址,但是他们属于形参怎么理解, 解决方案 int test(a,b,c)中的形参---------------------- 解决方案二: 实参是指向数据的真正地址的变量参数,形参只是一个副本或者是地址的副本. 一般情况下在调用函数的时候传递的是实参,在函数内部的参数是形参. 形参是为了让传递进来的数据可以被使用才有的. 解决方案三: 这是引用,不是地址.形参说的是函数中参数的名字,实参说的是调用者传

c/c++中宏定义##连接符 和#符的使用

C语言中如何使用宏C(和C++)中的宏(Macro)属于编译器预处理的范畴,属于编译期概念(而非运行期概念).下面对常遇到的宏的使用问题做了简单总结.关于#和##在C语言的宏中,#的功能是将其后面的宏参数进行字符串化操作(Stringfication),简单说就是在对它所引用的宏变量 通过替换后在其左右各加上一个双引号.比如下面代码中的宏:#define WARN_IF(EXP)    do{ if (EXP)    fprintf(stderr, "Warning: " #EXP &

C语言中宏定义使用的小细节_C 语言

#pragma#pragma 预处理指令详解 在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作.#pragma指令对每个编译器给出了一个方法,在保持与C和 C++语言完全兼容的情况下,给出主机或操作系统专有的特征.依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的. 其格式一般为: #Pragma Para.............etc.. baike.baidu.com/view/1451188.htm

C++中宏定义和内联函数区别

一.宏定义和内联函数的区别 1. 宏定义不是函数,但是使用起来像函数.预处理器用复制宏代码的方式代替函数的调用,省去了函数压栈退栈过程,提高了效率.     内联函数本质上是一个函数,内联函数一般用于函数体的代码比较简单的函数,不能包含复杂的控制语句,while.switch,并且内联函数本身不能直接调用自身.如果内联函数的函数体过大,编译器会自动的把这个内联函数变成普通函数. 2. 宏定义是在预编译的时候把所有的宏名用宏体来替换,简单的说就是字符串替换     内联函数则是在编译的时候进行代码

宏定义中的##操作符和... and _ _VA_ARGS_ _

1.Preprocessor Glue: The ## Operator 预处理连接符:##操作符 Like the # operator, the ## operator can be used in the replacement section of a function-like macro.Additionally, it can be used in the replacement section of an object-like macro. The ## operator co

深入浅出VC++串口编程之基于Win32 API

1.API描述 在WIN32 API中,串口使用文件方式进行访问,其操作的API基本上与 文件操作的API一致. 打开串口 Win32 中用于打开串口的API 函数为 CreateFile,其原型为: HANDLE CreateFile ( LPCTSTR lpFileName, //将要打开的串口逻辑名,如COM1 或COM2 DWORD dwAccess, //指定串口访问的类型 ,可以是读取.写入或两者并列 DWORD dwShareMode, //指定共享属性,由于串口不 能共享,该参数

C++中的变长参数深入理解_C 语言

前言 在吸进的一个项目中为了使用共享内存和自定义内存池,我们自己定义了MemNew函数,且在函数内部对于非pod类型自动执行构造函数.在需要的地方调用自定义的MemNew函数.这样就带来一个问题,使用stl的类都有默认构造函数,以及复制构造函数等.但使用共享内存和内存池的类可能没有默认构造函数,而是定义了多个参数的构造函数,于是如何将参数传入MemNew函数便成了问题. 一.变长参数函数 首先回顾一下较多使用的变长参数函数,最经典的便是printf. extern int printf(cons

如何在C#中使用Win32 API和其他库

C# 用户经常提出两个问题:"我为什么要另外编写代码来使用内置于 Windows 中的功能?在框架中为什么没有相应的内容可以为我完成这一任务?"当框架小组构建他们的 .NET 部分时,他们评估了为使 .NET 程序员可以使用 Win32 而需要完成的工作,结果发现 Win32 API 集非常庞大.他们没有足够的资源为所有 Win32 API 编写托管接口.加以测试并编写文档,因此只能优先处理最重要的部分.许多常用操作都有托管接口,但是还有许多完整的 Win32 部分没有托管接口. 平台