C++ Visual studio在错误消息中将大写字母A添加到函数名

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

我已经尝试过制作一个最小的测试用例来复制它,但是没有成功

添加一个显示错误的

这是对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::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 API
RegisterClass
),但这是因为微软在API中引入Unicode时保持向后兼容性的愚蠢方式。不是Visual Studio。它是系统函数的真实名称。后缀“A”代表“ansi”。在RegisterClass上按F12,您将看到。F12将我带到屏幕截图左侧的函数。。状态::RegisterClass。。我也在该函数的实例上调用它(m_状态)请不要发布错误消息的图片–发布文本。Windows是Unicode操作系统。使用ASCII字符串和函数不是最好的主意。这是因为所有示例、示例、SDK代码和项目都使用了诸如_t之类的宏。这可能会导致很多痛苦和客户投诉,除非您的唯一用户居住在美国,而且永远不要尝试o更改他们的语言环境(如西班牙语)