V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
whoami9894
V2EX  ›  C

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

  •  
  •   whoami9894 · 2018-09-09 11:59:02 +08:00 · 2460 次点击
    这是一个创建于 2296 天前的主题,其中的信息可能已经有所发展或是发生改变。

    下载了 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>正常过编译

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

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

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

    添加文件到工程
    whoami9894
        7
    whoami9894  
    OP
       2018-09-09 13:35:04 +08:00
    @newtype0092
    @GeruzoniAnsasu
    好的,感谢
    innoink
        8
    innoink  
       2018-09-09 13:37:27 +08:00 via Android
    链接过程没找到 stack 的编译单元
    FrankHB
        9
    FrankHB  
       2018-09-16 06:42:29 +08:00
    蛤?“堆栈”?_+大写字母标识符? int ? delete[]? accessor 没 const noexcept ?打死打死(
    一看就是没添加 cbp 嘛,除此之外跟 C::B 有什么关系,怎么脑补出头文件包含问题的?
    顺便很不巧,C::B 的头文件包含还真有个坑,因为它的 build system 是正则#include 的,所以#include 个宏名不会算到依赖更新里。不过你显然还没被坑到的程度……
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3323 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 00:50 · PVG 08:50 · LAX 16:50 · JFK 19:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.