是否可以使用方法返回使用 #define 创建的变量
Is it possible to use a method to return a variable created using #define?
所以想象一下我有代码:
#define ID_BUTTON 1
为了给自己一个变量,以便在使用 CreateWindow()
函数创建按钮时使用。
现在,我是否可以使用一种方法返回ID_BUTTON?通常我会发现它相对容易,但我不知道我必须指定什么函数类型。
所以
1(可能吗?
2( 如果是这样,我必须使用什么功能类型?
请记住,它只是简单的代码,例如:
<function_type> getID() {
return ID_BUTTON;
}
谢谢
杰
从技术上讲,你想要的实际上是使用 C++11 decltype
#define ID_BUTTON 1
auto getID() -> decltype(ID_BUTTON)
{
return ID_BUTTON;
}
int main()
{
auto x = getID();
}
在那里,无需为ID_BUTTON
或函数指定int
。
但是,您的问题的真正答案应该是:不要对常量使用宏。C++为此const
(截至最近(constexpr
。
假设你不明白什么
#define ID_BUTTON 1
甚至做到:
#define
、const
、constexpr
和 enum
语句不创建变量,而是创建常量。变量和常量都是引用程序中值的标识符。不同之处在于常量不能在运行时更改,而变量可以。
但是,#define
不会创建任何普通常量。它实际上告诉编译器的一部分称为预处理器,实际上将源代码中的文本ID_BUTTON
替换为字符串1
。这可能很有用,这就是你必须为 C 做的,但在C++中,constexpr
(在 C++11 中引入(通常更优化。请参阅Christian Hackl的回答以获取更多信息。
如果您打算使用常量将值传递给 API,这是您计划对 ID_BUTTON
执行的操作,API 通常会告诉您它期望的类型,因此您可以使用该类型,而不是让编译器确定作业的最佳类型。但是,请参阅下面我关于 Windows 中的控件标识符的讨论,因为对于ID_BUTTON
的特定情况有一个问题。
如果您控制了该类型,则必须多考虑一下才能确定要使用的类型。在某些情况下,该语言的类型提升规则会让你侥幸逃脱只说1
没有类型,但是如果你正在创建已知的小整数或大整数,或位字段,或浮点数,你将需要使用适当的类型名称或限定符(short
,long
,unsigned
,float
,double
, 等(。弄清楚要去哪里需要一点时间,但是一旦你做得足够多,你就会很自然地去做。
假设您不了解 Windows 中的控件标识符的工作原理:
大多数采用控件标识符的 API 函数(如 GetDlgItem()
(都将控件标识符作为int
;因此您的控件标识符应具有类型 int
。
但是,CreateWindow()
和CreateWindowEx()
期望控件标识符作为倒数第三个参数。此参数的类型为 HMENU
。C++不会让你把int
塞进HMENU
,所以你必须使用石膏:(HMENU) ID_BUTTON
。(可能有一个等效的C++式演员阵容,但我不知道/忘记了它是什么。
此外,如果要使用资源文件,则必须使用 #define
语句来创建ID_xxx
常量名称,因为资源文件格式没有 const
、 constexpr
或 enum
。在这种情况下,请继续对标识符使用 #define
,将这些#define
放入其自己的包含文件中,并从C++源和资源文件中#include
该文件。
如果不使用资源文件,则根本不需要担心使用控件标识符;只需直接使用每个控件的HWND
即可。如果需要在窗口中处理选项卡导航或其他对话框消息,仍应分配控件标识符,但除此之外,您可以直接使用 HWND
s。(我忘记了选项卡导航中是否涉及控件标识符。
最后,有许多预定义的控件标识符对对话框管理器具有特殊意义。这是来自Microsoft的winuser.h:
/*
* Dialog Box Command IDs
*/
#define IDOK 1
#define IDCANCEL 2
#define IDABORT 3
#define IDRETRY 4
#define IDIGNORE 5
#define IDYES 6
#define IDNO 7
#if(WINVER >= 0x0400)
#define IDCLOSE 8
#define IDHELP 9
#endif /* WINVER >= 0x0400 */
您自己的控件标识符应避免与这些标识符冲突;您的ID_BUTTON
与IDOK
冲突。(如果它们确实发生冲突,您会看到奇怪的事情,例如您的控件在对话框管理器知道的键盘快捷键上激活。这个问题的规范解决方案是开始对控件标识符进行编号100
(我相信Visual Studio对此负责,但我不确定(。
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 使用std::multimap迭代器创建std::list
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 使用CMake创建QML插件
- 如何在c++中为模板函数实例创建快捷方式
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- OpenCV EqualizeHist()从彩色图像创建黑白图像
- 试图在visual studio上用C++创建一个桌面应用程序
- 如何创建不执行任何操作的 #define
- 在#define宏中创建一个实例
- 是否可以使用预处理器函数创建其他 #define?
- 是否可以使用方法返回使用 #define 创建的变量
- #define 和创建普通类型有什么区别
- 使用 #define 和 clang 为 info.plist 创建版本号变体
- 我可以创建一个#define并在throw中使用它吗?
- 通过#define macro创建自定义类
- 将c++ #Define枚举创建转换为vb.net
- 如何创建一个#define来创建一个2d矢量
- 为指针星号创建一个#define