c++ 头文件里申明的函数部分无法被调用 跪求助攻

akunone 2018-07-18 11:49:18
问题:


list.h 函数申明 ( list.cpp里函数定义) (listsort.cpp 程序入口) (文件都在一个工程下) 最后两个函数无法调用
struct ListNode
{
int m_nValue;
ListNode* m_pNext;
};

_declspec(dllexport) ListNode* CreateListNode(int value);
_declspec(dllexport) void ConnectListNodes(ListNode* pCurrent, ListNode* pNext);
_declspec(dllexport) void PrintListNode(ListNode* pNode);
_declspec(dllexport) void PrintList(ListNode* pHead);
_declspec(dllexport) void DestroyList(ListNode* pHead);
_declspec(dllexport) void AddToTail(ListNode** pHead, int value);
_declspec(dllexport) void RemoveNode(ListNode** pHead, int value);

_declspec(dllexport) void PrintListReverse(ListNode* pHead); //无法调用
_declspec(dllexport) void PrintListReverse_Recursion(ListNode* pHead); //无法调用


list.cpp 函数定义 最后两个函数无法在listsort.cpp里调用
#include "stdafx.h"
#include "list.h"
#include "stdio.h"
#include "stdlib.h"
#include<stack>
#include<iostream.h>

ListNode* CreateListNode(int value)
{
ListNode* pNode = new ListNode();
pNode->m_nValue = value;
pNode->m_pNext = NULL;

return pNode;
}

void ConnectListNodes(ListNode* pCurrent, ListNode* pNext)
{
if(pCurrent == NULL)
{
printf("ERROR to connect nodes.\n");
exit(1);
}
pCurrent->m_pNext = pNext;
}

void PrintListNode(ListNode* pNode)
{
if(pNode == NULL)
{
printf("pNode is NULL.\n");
}
else
{
printf("pNode is %d.\n", pNode->m_nValue);
}
}

void PrintList(ListNode* pHead)
{
ListNode* pNode = pHead;
while(pNode != NULL)
{
printf(" %d.\t", pNode->m_nValue);
pNode = pNode->m_pNext ;
}
printf("\n");
}

void DestroyList(ListNode* pHead)
{
ListNode* pNode = pHead;
while(pNode != NULL)
{
delete pNode;
pHead = pHead->m_pNext;
pNode = pHead ;
}

}

void AddToTail(ListNode** pHead, int value)
{
ListNode* pNew = new ListNode();
pNew->m_nValue = value;
pNew->m_pNext = NULL;
if(*pHead == NULL)
{
*pHead = pNew;
}
else
{
ListNode* pNode = *pHead;
while(pNode->m_pNext != NULL)
{
pNode = pNode->m_pNext;
}
pNode->m_pNext = pNew;
}
}

void RemoveNode(ListNode** pHead, int value)
{
if(pHead==NULL || *pHead==NULL)
{
return;
}

ListNode* pToBeDelete = NULL;
if((*pHead)->m_nValue == value)
{
pToBeDelete = *pHead;
*pHead = (*pHead)->m_pNext ;
}
else
{
ListNode* pNode = *pHead;
while(pNode->m_pNext != NULL && (pNode)->m_pNext->m_nValue != value)
{
pNode = pNode->m_pNext;
}

if(pNode->m_pNext != NULL && (pNode)->m_pNext->m_nValue == value)
{
pToBeDelete = pNode->m_pNext;
pNode->m_pNext = pNode->m_pNext->m_pNext ;
}
}

if(pToBeDelete != NULL)
{
delete pToBeDelete;
pToBeDelete = NULL;
}
}
////////////////////////////无法调用///////////////////////////////////////////////
void PrintListReverse(ListNode* pHead)
{
std::stack<ListNode*> nodes;
ListNode* pNode = pHead;

while(pNode != NULL)
{
nodes.push(pNode);
pNode = pNode->m_pNext ;

}

while(!nodes.empty())
{
pNode = nodes.top();
printf("%d \t", pNode->m_nValue);
nodes.pop();
}
printf(" \n");
}

void PrintListReverse_Recursion(ListNode* pHead)
{
if(pHead != NULL)
{
if(pHead->m_pNext != NULL)
PrintListReverse_Recursion(pHead->m_pNext);

printf("%d \t", pHead->m_nValue);
}
}
//////////////////////////////无法调用/////////////////////////////////////////////////


listsort.cpp 程序入口


#include "stdafx.h"
#include "stdlib.h"
#include "list.h"
#include<iostream.h>
#include<stack>


using namespace std;

//void PrintListReverse(ListNode* pHead);
//void PrintListReverse_Recursion(ListNode* pHead); //需在此申明 否则无法识别

void printlist_re()
{
ListNode* node1 = CreateListNode(1);
ListNode** p_node1 = &node1;
AddToTail(p_node1, 2);
AddToTail(p_node1, 3);
AddToTail(p_node1, 4);
AddToTail(p_node1, 5);
PrintList(*p_node1);

PrintListReverse(node1); //错误 1 error C3861: “PrintListReverse”: 找不到标识符
PrintListReverse_Recursion(node1); //错误 2 error C3861: “PrintListReverse_Recursion”: 找不到标识符
}



int _tmain(int argc, _TCHAR* argv[])
{


printlist_re();


system("pause");
return 0;
}

...全文
728 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-07-19
  • 打赏
  • 举报
回复
偶遇到类似问题都是用
“每次用/*...*/注释掉不同部分再重新编译,直到定位到具体语法出错的位置。”
的方法解决的。
赵4老师 2018-07-19
  • 打赏
  • 举报
回复
“给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门!
递归函数关注以下几个因素
·退出条件
·参数有哪些
·返回值是什么
·局部变量有哪些
·全局变量有哪些
·何时输出
·会不会导致堆栈溢出
akunone 2018-07-19
  • 打赏
  • 举报
回复
会不会和堆栈之类的有关?我那个函数有用到std::stack 还有一个函数是递归函数,就这两个函数不能调用,其它的都好好的。
akunone 2018-07-19
  • 打赏
  • 举报
回复
引用 1 楼 housecarl 的回复:
_declspec(dllexport)这个是导出函数的定义吧?lz是写了一个动态库吗?
但是看到lz好像是直接调用的,这个。。。


我是直接调用,可是删了_declspec(dllexport) 也没用,一样报错
akunone 2018-07-19
  • 打赏
  • 举报
回复
vs 2008

引用 2 楼 sghcpt 的回复:
楼主,你在那个编译环境编译的?我在windows vs2013中用你给出的代码,在控制台工程中,除了把#include<iostream.h>改为#include<iostream>后,编译时正确的,也能正确运行~~~~~

vs2008 控制台工程 用#include<iostream>会报错找不到文件 可能是编译器问题
sghcpt 2018-07-19
  • 打赏
  • 举报
回复
楼主,你在那个编译环境编译的?我在windows vs2013中用你给出的代码,在控制台工程中,除了把#include<iostream.h>改为#include<iostream>后,编译时正确的,也能正确运行~~~~~
轻箬笠 2018-07-19
  • 打赏
  • 举报
回复
_declspec(dllexport)这个是导出函数的定义吧?lz是写了一个动态库吗?
但是看到lz好像是直接调用的,这个。。。
akunone 2018-07-19
  • 打赏
  • 举报
回复
已解决 我的list.h 是从一个dll 工程utilities拉过去的,把#include "list.h" 改成 #include "..\utilities\list.h" 就好了。

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧