c++ 类声明和定义分离后出现的问题
我用c++写了一个小型的project,main.cpp中,需要包括三个头文件,lexer.h,parser.h,interpreter.h
这三个头文件分别有一个同名的类的声明和实现,编译和运行都是成功的,但现在我想把类的声明和实现分开,比如lexer类的声明在lexer.h,实现在lexer.cpp,打算在makefile中先分别编译再链接,但分离后会出现一些函数和变量多次声明的error,我想知道应该怎么解决?
补充以下,代码长度略长,只贴出部分:
makefile:
srcpath = src
.PHONY: all clean
all: main
main: $(srcpath)/main.o $(srcpath)/lexer.o
g++ -o main $(srcpath)/main.o $(srcpath)/lexer.o
main.o: $(srcpath)/main.cpp
g++ -c $(srcpath)/main.cpp
lexer.o: $(srcpath)/lexer.cpp
g++ -c $(srcpath)/lexer.cpp
clean:
rm -rf main
在这里我只把lexer.h拆成了lexer.h(类声明)和lexer.cpp(类实现)。
报错信息如下:
src/lexer.o:(.bss+0x0):
MAX_NUM'被多次定义
src/main.o:(.bss+0x0):第一次在此定义
src/lexer.o:在函数‘getString(int)’中:
lexer.cpp:(.text+0x0):
getString(int)'被多次定义
src/main.o:main.cpp:(.text+0x0):第一次在此定义
src/lexer.o:在函数‘compNums(Token, Token, int)’中:
……
其中报错为多次定义的这些变量/函数,我定义在token.h中,这个头文件在lexer.h和parser.h都有包含,每个头文件我都有声明防止重复包括的宏,代码如同:
#ifndef LEXER_H
#define LEXER_H
//my code
#endif
谢谢!
Answers
以下描述仅个人理解...望轻拍
局部变量函数:
如果仅仅是
classA.cpp
中要用,那直接定义到
classA.cpp
头部;
全局变量函数:
你可以另外新建两文件:
global.cpp/global.h
在
global.cpp
中定义,然后在
global.h
中
extern
导出,
然后在
classA.cpp
、
classB.cpp
头部
#include "global.h"
即可使用上述变量或函数。
需要交叉包含的
XXX.h
文件中直接定义变量函数会出问题
我以前在使用VC6.0时,就被弄惨了,在VS2012中还好一点,新建类头文件顶部默认有一行:
#pragma once