请教 code::blocks 中包含头文件的问题

2018-09-09 11:59:02 +08:00
 whoami9894

下载了 code::blocks 感觉挺好的,很轻,功能也不错,不过好像我使用姿势不对?

写了Stackcal.h Stackcal.cpp定义一个堆栈类

//this is *.h
#ifndef _STACKCAL_H
#define _STACKCAL_H

class StackCal{
	private:
		int MAXSIZE;
		char* stack_ptr;
		char* stack_g;
	public:
		StackCal(int t);
		~StackCal();
		bool push(char s);
		char pop();
		bool isempty();
		bool isfull();
};

#endif

//this is *.cpp
#include "stackcal.h"

StackCal::StackCal(int t){
	MAXSIZE = t;
	stack_g = new char[MAXSIZE];
	stack_ptr = &stack_g[0];
}

StackCal::~StackCal(){
	delete[] stack_g;
}

bool StackCal::isempty(){
	return stack_ptr==&stack_g[0] ? true : false;
}

bool StackCal::isfull(){
	return stack_ptr==&stack_g[MAXSIZE+1] ? true : false;
}

bool StackCal::push(char s){
	if (isfull()){
		return false;
	}
	*stack_ptr++ = s;
	return true;
}

char StackCal::pop(){
	if (isempty()){
		return 'x';
	}
	char result = *--stack_ptr;
	return result;
}

然后另一个文件中调用

#include "stackcal.h"
#include <iostream>
int main(){
	StackCal op = StackCal(10);
	char a = 'a';
	char b = 'b';
	op.push(a);
	op.push(b);
	std::cout << op.pop() << std::endl;
	std::cout << op.pop() << std::endl;
	return 0;
}


调用时#include <Stackcal.h>报错:

undefined reference to `StackCal::StackCal(int)'
undefined reference to `StackCal::push(char)'
undefined reference to `StackCal::push(char)'
undefined reference to `StackCal::pop()'
undefined reference to `StackCal::pop()'
undefined reference to `StackCal::~StackCal()'
undefined reference to `StackCal::~StackCal()'

当改为包含*.cpp文件#include <Stackcal.cpp>正常过编译

求教,是我哪里姿势不对吗....

2367 次点击
所在节点    C
9 条回复
chenstack
2018-09-09 12:09:10 +08:00
推测是原先 Stackcal.cpp 未参与编译,印象中要先配置一下 code::blocks,或者检查一下是否是编译整个项目而不是单个文件
zyqf
2018-09-09 12:09:27 +08:00
你可以理解 include 为把文件代码插入该行。
whoami9894
2018-09-09 12:14:17 +08:00
@chenstack
嗯,我想就是包含头文件的话,ide 可能没有把类的实现包含进来
chungzh
2018-09-09 12:19:33 +08:00
你试试把 Stackcal.cpp 也在主程序里 include 一下
newtype0092
2018-09-09 13:23:42 +08:00
你自己用过 gcc 命令直接编译么? include 头文件只是告诉编译器我调用的这些函数、类是有定义过的,具体调用的话是连定义这些函数、类的文件一起编译才行。
具体编译执行的命令可以看到,你看下有没有加入 Stackcal.cpp ,没有的话自己搜下多文件编译相关的设置就好了。

其实开始的时候还是直接命令行 gcc、g++直接去编译的好,能让你了解下具体的编译、链接的流程,报出的错误也很明确是那一步错了,等熟悉了流程再用 IDE,报出这类错误你也大概知道是哪部分的问题了,因为各个 IDE 的设置都不太一样,只要明确了问题,就算对 IDE 不熟悉,也知道该搜哪些相关的设置。
GeruzoniAnsasu
2018-09-09 13:26:23 +08:00
新建工程

添加文件到工程
whoami9894
2018-09-09 13:35:04 +08:00
@newtype0092
@GeruzoniAnsasu
好的,感谢
innoink
2018-09-09 13:37:27 +08:00
链接过程没找到 stack 的编译单元
FrankHB
2018-09-16 06:42:29 +08:00
蛤?“堆栈”?_+大写字母标识符? int ? delete[]? accessor 没 const noexcept ?打死打死(
一看就是没添加 cbp 嘛,除此之外跟 C::B 有什么关系,怎么脑补出头文件包含问题的?
顺便很不巧,C::B 的头文件包含还真有个坑,因为它的 build system 是正则#include 的,所以#include 个宏名不会算到依赖更新里。不过你显然还没被坑到的程度……

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/487582

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX