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

时间:2016-03-17 00:06:36

标签: c++ compiler-errors

我已经为这个bug编写了一个最小的案例,它生成了EXTRN语句:     EXTRN _。?AU_anc @ 8:PROC

这是代码 - 有人可以发现我做错了什么。当我有三个以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 };

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

1 个答案:

答案 0 :(得分:0)

您实际上是否为ThFileRd() et al?

的任何地方定义了代码

使用编写的代码我得到了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被注释掉时,会出错。