C++ Visual studio在错误消息中将大写字母A添加到函数名
我已经尝试过制作一个最小的测试用例来复制它,但是没有成功 添加一个显示错误的 这是对SetClass函数的调用C++ Visual studio在错误消息中将大写字母A添加到函数名,c++,visual-studio,C++,Visual Studio,我已经尝试过制作一个最小的测试用例来复制它,但是没有成功 添加一个显示错误的 这是对SetClass函数的调用 m_luaState[“MyClass”].SetClass(“AddTo”、&MyClass::Add) 这是MyClass: class MyClass { public: MyClass(I32 i) : m_i(i), m_j(2*i) { } I32 m_j; void Add(I32 iv) { std
m_luaState[“MyClass”].SetClass(“AddTo”、&MyClass::Add)代码>
这是MyClass:
class MyClass
{
public:
MyClass(I32 i) : m_i(i), m_j(2*i)
{
}
I32 m_j;
void Add(I32 iv)
{
std::cout << iv + m_i + m_j;
}
private:
I32 m_i;
};
class-MyClass
{
公众:
MyClass(I32 i):m_i(i),m_j(2*i)
{
}
I32 m_j;
无效添加(I32 iv)
{
这个问题其实很有趣,并不是你做错了什么。这是因为Windows的功能以及Windows在编程时如何处理Unicode
Windows几乎所有的功能都有两个变体,如果您看到底部的表,您会看到它们被称为RegisterClassW
和RegisterClassA
。W
函数用于Unicode版本,其中所有字符串和字符的类型都是wchar\u t
。A
变体是“ANSI”变体,使用普通char
字符
这里的问题是Windows使用宏来决定使用哪一个函数,基本上是这样做的
#ifdef UNICODE
# define RegisterClass RegisterClassW
#else
# define RegisterClass RegisterClassA
#endif
这是有问题的,因为预处理器将用RegisterClassA
符号替换对RegisterClass
成员函数的调用,从而导致错误
简单的解决方案是在包含
后直接(或在其他合适的位置)取消定义寄存器类
宏。另一个方法是将注册表类重命名为与Windows函数不冲突的内容。这个问题实际上很有趣,并且不是您做错了什么。这是因为Windows函数以及Windows在编程时如何处理Unicode
Windows几乎所有的功能都有两个变体,如果您看到底部的表,您会看到它们被称为RegisterClassW
和RegisterClassA
。W
函数用于Unicode版本,其中所有字符串和字符的类型都是wchar\u t
。A
变体是“ANSI”变体,使用普通char
字符
这里的问题是Windows使用宏来决定要使用哪个函数,基本上它可以这样做
#ifdef UNICODE
# define RegisterClass RegisterClassW
#else
# define RegisterClass RegisterClassA
#endif
这是有问题的,因为预处理器将用RegisterClassA
符号替换对RegisterClass
成员函数的调用,从而导致错误
简单的解决方案是在包含
后直接(或在其他合适的位置)取消注册表类的定义。另一种方法是将注册表类
重命名为与Windows函数不冲突的内容。您的注册表类(…)
方法名称将被Windows#define RegisterClass
替换。由于您是以ANSI身份编译的,因此您正在为RegisterClass
选择ANSI别名,即RegisterClassA
(如果您是编译Unicode,它将是RegisterClassW
)
您可以重命名您的RegisterClass(…)
方法(如果这是一个可行的选项),排除冲突的Windows标头(可能不是选项),或者有条件地在声明您的RegisterClass(…)
方法的标头顶部#undef RegisterClass
,类似于:
#ifdef RegisterClass
#undef RegisterClass
#endif
关于冲突符号的一些附加参考:您的注册表类(…)
方法名称将被Windows#define RegisterClass
替换。由于您是以ANSI身份编译的,因此您选择了注册表类
的ANSI别名,即注册表类
(如果您正在编译Unicode,它将是RegisterClassW
)
您可以重命名您的RegisterClass(…)
方法(如果这是一个可行的选项),排除冲突的Windows标头(可能不是选项),或者有条件地在声明您的RegisterClass(…)
方法的标头顶部#undef RegisterClass
,类似于:
#ifdef RegisterClass
#undef RegisterClass
#endif
关于冲突符号的一些附加参考:不是Visual Studio。它是系统函数的真实名称。后缀“A”表示“ansi”。在RegisterClass上按F12,您将看到。F12将我带到屏幕截图左侧的函数..State::RegisterClass..我也在该函数的实例上调用它(m_State)请不要发布错误消息的图片–发布文本。Windows是Unicode操作系统。使用ASCII字符串和函数不是最好的主意。这是因为所有示例、示例、SDK代码和项目都使用了诸如_t之类的宏。这可能会导致很多痛苦和客户投诉,除非您的唯一用户居住在美国,而且永远不要尝试o更改他们的区域设置,例如,西班牙语。他们也永远不要尝试加载Unicode文件(UTF8或UTF16)。如果必须选择编码,请选择明确的本机代码one@PanagiotisKanavos问题与希望使用ANSI系统调用的OP无关(OP甚至没有调用Windows APIRegisterClass
),但这是因为微软在API中引入Unicode时保持向后兼容性的愚蠢方式。不是Visual Studio。它是系统函数的真实名称。后缀“A”代表“ansi”。在RegisterClass上按F12,您将看到。F12将我带到屏幕截图左侧的函数。。状态::RegisterClass。。我也在该函数的实例上调用它(m_状态)请不要发布错误消息的图片–发布文本。Windows是Unicode操作系统。使用ASCII字符串和函数不是最好的主意。这是因为所有示例、示例、SDK代码和项目都使用了诸如_t之类的宏。这可能会导致很多痛苦和客户投诉,除非您的唯一用户居住在美国,而且永远不要尝试o更改他们的语言环境(如西班牙语)