VisualStudio 优化编译器版本 19.00.23506.0 中存在明显的编译错误

Apparent compile bug in VisualStudio Optimizing Compiler Version 19.00.23506.0

本文关键字:存在 错误 编译 编译器 优化 版本 23506 VisualStudio      更新时间:2023-10-16

我已经为这个错误写了一个最小的情况,它生成了EXTRN语句: 外部 _.?AU_anc@8:程序

这是代码 - 有人可以发现我做错了什么。 当我有三个以 THRCOMP 开头的语句和 3 个相应的 proc_ent 语句时,它会编译第一个和最后一个 OK,以及生成上述错误的第二个。

struct  _anchor
{
    int(*svc_addr) (int, void * vptr, ...);
void *reserved;
};
typedef  _anchor anchor;
#define THRCOMP extern "C"  __declspec(dllexport) int __stdcall
struct _proc_ent {
_proc_ent *succ;
char proc_name[32];
char comp_name[200];
int (__stdcall *faddr) (_anchor anch);
void *proc_block;   // used as a temporary placeholder by thxbnet
void * label_ptr;   // points to a label for subnets     
bool trace;
bool composite;
bool must_run;  
};
typedef  _proc_ent proc_ent;
#define TRACE true
#define COMPOS true
#define NULL 0
THRCOMP ThFileWt(_anchor anch);
THRCOMP ThCopyNL(_anchor anch);
THRCOMP ThFileRd(_anchor anch);
proc_ent P0 = { NULL, "Read", "ThFileRd", ThFileRd, NULL, NULL, 
    TRACE, !COMPOS };
proc_ent P1 = { &P0, "Show", "ThFileWt", ThFileWt, NULL, NULL,
    TRACE, !COMPOS };
proc_ent P2 = { &P1, "Copy", "ThCopyNL", ThCopyNL, NULL, NULL, 
    TRACE, !COMPOS };

如果有人能阐明这一点,或者给我一个解决方法,那就太好了。提前感谢!

你真的在任何地方为 ThFileRd() 等人定义了代码吗?

使用编写的代码,我得到了 p0、p1 等的未定义符号,这些符号似乎对应于除最后一个之外的所有函数名称:

1>Win32Project1.obj : error LNK2001: unresolved external symbol _ThFileRd@8
1>Win32Project1.obj : error LNK2001: unresolved external symbol _.?AU_anc@8
1>Win32Project1.obj : error LNK2001: unresolved external symbol _ThFileWt@8
1>Win32Project1.obj : error LNK2001: unresolved external symbol _ThCopyNL@8

当我添加proc_ent P3 = { &P2, "Wibble", "ThWibble", ThWibble, NULL, NULL, TRACE, !COMPOS };和相应的 THRCOMP 定义时得到了这个。

这几乎是我希望看到的,因为这些函数没有代码;但出乎意料的是最后一个函数的名称更改(显然从ThWibble更改为.?AU_anc)。

重新排列THRCOMP定义的顺序没有任何区别。

如果我注释掉 p3 和 p2,则名称更改将移至 p1:

1>Win32Project1.obj : error LNK2001: unresolved external symbol _ThFileRd@8
1>Win32Project1.obj : error LNK2001: unresolved external symbol _.?AU_anc@8

但是如果我更改定义以包含函数体,例如THRCOMP ThWibble(_anchor anch) {return 0;},代码编译时没有任何错误。 我正在使用VS2015社区,并将代码粘贴到Win32 DLL项目中。

我不知道_.?AU_anc@8来自哪里,以及为什么这个值应该只对应于最后一个 pN 定义。 我会认为如果 p2 定义有问题,那么无论是否定义 p3,错误都会保留,同样,如果 p1 定义没有问题,当 p2 被注释掉时,它不会突然出错。