我是一位C++的初学者,不知能否问一个问题呢?
编译环境:Borland C++ 3.1
操作系统:Window98
操作:我在一个头文件(*.h)中声明了一个结构体(或类),在另外的一个C++(*.cpp)文件中定义了这个结构体(或类)。另外我新建了一个测试,它通用"#Include "*.h" 把前面头文件包含进该测试程序中。我把 *.h 、*.cpp 文件先编译通过,测试程序也编译通过,并生成了*.obj文件(编译头文件时不产生*.obj文件,而是编译头文件的定义文件时产生*.obj文件的)
问题1:当我把头文件包含进定义文件和测试文件时,使用格式只能是:#include "..\[头文件所在目录\]头文件名.h" 。 我看许多书上写如果 头文件是在当前文件的同一目录一只要用:#include "头文件名.h" 直接包含进来就可以了,为什么我这样写它总说找不到该文件 呢?
问题2、当测试程序进行连接时,总提示说文件中所声明的函数没有定义,但我是在另外一个文件中的确已经定义过了,但是它始终提示没 有定义头文件中所定义的函数,我想这是C++的最基本的工作方式(声明和定义分开),怎么会不行呢,请指点?
问题3、我看Borland C++ 3.1 的 Option 的Compile下有一个选项好像是设定编译器是支持C或C++,当我选择第一个选项时,程序连结构 本中声明函数都不行(也不支持类的),请问在Borland C++ 3.1 中编写C++程序编译器要作什么设定吗?
例子:
// Lib.h
struct stash{
int size ;
int quantity;
next stash;
void intitialize(int size)
int add(void* element)
void get()
void cleanup()
}
// lib.cpp
#include "..\1\lib.h"
stash::add {...}
stash::get {...}
stash::cleanup {...}
// libtest.cpp
#include "..\1\lib.h"
main()
{
stash intStash, stringStash;
intStash.initialize(sizeof(int)); / / 这句提示initialize 没有定义
stringStash(100); / / 这句提示initialize 没有定义
....
intstash::cleanup; / / 这句提示cleanup 没有定义
stringStash::cleanup; / / 这句提示cleanup 没有定义
}
9 个解决方案
#1
是不是应该这样:
// libtest.cpp
#include "..\1\lib.cpp"
// libtest.cpp
#include "..\1\lib.cpp"
#2
用VC吧,没这个问题
#3
1.是指在当前目录中而不是在源文件同一个目录中,设置当前目录可在File -> Change dir...中。
2.void get()应为void get(void),C++中要求显式的注明void。
3.可能是头文件的事,也可能是因为定义与使用不在同一个文件中,建一个工程试试。
2.void get()应为void get(void),C++中要求显式的注明void。
3.可能是头文件的事,也可能是因为定义与使用不在同一个文件中,建一个工程试试。
#4
VC是Windows下的,想当年的MS C/C++不知比BC++烂多少倍呢,如今的VC也不如Borland C++ Builder。
#5
小飞侠:如果,像你那样当然可以了,但是那样的话等于把整个定义文件也包含进去了呀,这样如果项目大了, 是不是主文件特别大呀!
#6
Maxwell(不可知):你好,谢谢给我的答复,你说的第一个问题我明白了,第二个问题,一定要显示的说明吗 ?我看的C++书中好象没有这样特别的要求,第三条,我也试过了,但是还是不行不知是不是同编译器Option选项中的设置有关。
#7
用VC 我试过,可以通过。它是自己有一个工程式组。
再问一个问题, 我在VC下的一个控制台应用
v=realloc(指针变量,大小);
assert(v);
这时总是失败, 不知是为什么?
再问一个问题, 我在VC下的一个控制台应用
v=realloc(指针变量,大小);
assert(v);
这时总是失败, 不知是为什么?
#8
好像是()等价于C中的(...),我记不清了,好长时间不写程序了。
编译器中的那个设置,C++ Aways是指不管什么扩展名都当作C++程序,CPP是只有.cpp文件才当作C++程序。
我再给你试试看。
再问一个问题, 我在VC下的一个控制台应用
v=realloc(指针变量,大小);
assert(v);
这时总是失败, 不知是为什么?
那就是内存分配总失败,你可能代码有问题或是申请的内存太大了?
编译器中的那个设置,C++ Aways是指不管什么扩展名都当作C++程序,CPP是只有.cpp文件才当作C++程序。
我再给你试试看。
再问一个问题, 我在VC下的一个控制台应用
v=realloc(指针变量,大小);
assert(v);
这时总是失败, 不知是为什么?
那就是内存分配总失败,你可能代码有问题或是申请的内存太大了?
#9
initialize确实未定义
cleanup后面是不是该加()或是把::改成.
好长时间不写程序了,你给的程序也不全,自己试试吧。
cleanup后面是不是该加()或是把::改成.
好长时间不写程序了,你给的程序也不全,自己试试吧。
#1
是不是应该这样:
// libtest.cpp
#include "..\1\lib.cpp"
// libtest.cpp
#include "..\1\lib.cpp"
#2
用VC吧,没这个问题
#3
1.是指在当前目录中而不是在源文件同一个目录中,设置当前目录可在File -> Change dir...中。
2.void get()应为void get(void),C++中要求显式的注明void。
3.可能是头文件的事,也可能是因为定义与使用不在同一个文件中,建一个工程试试。
2.void get()应为void get(void),C++中要求显式的注明void。
3.可能是头文件的事,也可能是因为定义与使用不在同一个文件中,建一个工程试试。
#4
VC是Windows下的,想当年的MS C/C++不知比BC++烂多少倍呢,如今的VC也不如Borland C++ Builder。
#5
小飞侠:如果,像你那样当然可以了,但是那样的话等于把整个定义文件也包含进去了呀,这样如果项目大了, 是不是主文件特别大呀!
#6
Maxwell(不可知):你好,谢谢给我的答复,你说的第一个问题我明白了,第二个问题,一定要显示的说明吗 ?我看的C++书中好象没有这样特别的要求,第三条,我也试过了,但是还是不行不知是不是同编译器Option选项中的设置有关。
#7
用VC 我试过,可以通过。它是自己有一个工程式组。
再问一个问题, 我在VC下的一个控制台应用
v=realloc(指针变量,大小);
assert(v);
这时总是失败, 不知是为什么?
再问一个问题, 我在VC下的一个控制台应用
v=realloc(指针变量,大小);
assert(v);
这时总是失败, 不知是为什么?
#8
好像是()等价于C中的(...),我记不清了,好长时间不写程序了。
编译器中的那个设置,C++ Aways是指不管什么扩展名都当作C++程序,CPP是只有.cpp文件才当作C++程序。
我再给你试试看。
再问一个问题, 我在VC下的一个控制台应用
v=realloc(指针变量,大小);
assert(v);
这时总是失败, 不知是为什么?
那就是内存分配总失败,你可能代码有问题或是申请的内存太大了?
编译器中的那个设置,C++ Aways是指不管什么扩展名都当作C++程序,CPP是只有.cpp文件才当作C++程序。
我再给你试试看。
再问一个问题, 我在VC下的一个控制台应用
v=realloc(指针变量,大小);
assert(v);
这时总是失败, 不知是为什么?
那就是内存分配总失败,你可能代码有问题或是申请的内存太大了?
#9
initialize确实未定义
cleanup后面是不是该加()或是把::改成.
好长时间不写程序了,你给的程序也不全,自己试试吧。
cleanup后面是不是该加()或是把::改成.
好长时间不写程序了,你给的程序也不全,自己试试吧。