由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 基础问题:在header里面define function
相关主题
Help C++ Template function link error .又一个初级问题: C++中多如牛毛的#define格式
forward declarationC 里面有办法永久改变一个指针的属性吗?
interview question: make all class member functions virtual (转载)inline functions in C++
一道面试怪题C++. (转载)c++头文件太tmd恶心了
问低级问题What happens when recursion functions are declared inline?
弱问c++里有没有NULL这个keyword?static variable in template header
C++ Template QuestionC++方法全都内联有什么坏处?
recursive template?Question about friend in C++
相关话题的讨论汇总
话题: function话题: header话题: 里面话题: template话题: cpp
进入Programming版参与讨论
1 (共1页)
k*******d
发帖数: 1340
1
我知道一般情况下都是在header里面declare function, 在cpp里面define
function,inline function 和 function template要放在header里面。
不过我最近写一个程序,把class definition以及member function的definition都放在
header里面,有一些member function不是function template ,有一些是function
template,结果link的时候出现错误,说那些不是function template的function "already
defined in"某另外一个obj文件,这个情况是在我一个project(VC 2008)里面有多个cpp文件的
时候出现的。刚写完这个class的时候我用了个简短的测试程序,那时候整个project还只有一个cpp
文件,就没有出现这个错误。而我把这些member function definition移到cpp文件里面去link
的错误就没了。
另外,在另一个header里面我还定义了个non-membe
r****t
发帖数: 10904
2
在 binary 里面 define 只能一次。 declare 的东西编译器不为其生成 binary 所以可以多
次, 比如 template 这种。
你可能和我一样没有系统学过 c++,所以语言上不准确,建议拿本书看看,把名词拿准了。
没有“不是template的function”, 也没有 “用了 template的function”。名称拿准
了就不会有上面这些问题。
k*******d
发帖数: 1340
3
问题是,我有header guard,那么这个header的实际内容(也就是#ifndef #define 和
#endif之间的内容)只会被include一次吧,那么应该
function也只被define了一次啊
declare可以多次?应该也只能一次吧,完全一样的函数重复声明编译就会有错误
名词使用问题我改改吧,应该叫做function template比较确切,我是自己看C++ primer学的

以可以多
准了。
拿准

【在 r****t 的大作中提到】
: 在 binary 里面 define 只能一次。 declare 的东西编译器不为其生成 binary 所以可以多
: 次, 比如 template 这种。
: 你可能和我一样没有系统学过 c++,所以语言上不准确,建议拿本书看看,把名词拿准了。
: 没有“不是template的function”, 也没有 “用了 template的function”。名称拿准
: 了就不会有上面这些问题。

r****t
发帖数: 10904
4
translation unit, compilation unit.

【在 k*******d 的大作中提到】
: 问题是,我有header guard,那么这个header的实际内容(也就是#ifndef #define 和
: #endif之间的内容)只会被include一次吧,那么应该
: function也只被define了一次啊
: declare可以多次?应该也只能一次吧,完全一样的函数重复声明编译就会有错误
: 名词使用问题我改改吧,应该叫做function template比较确切,我是自己看C++ primer学的
:
: 以可以多
: 准了。
: 拿准

k*******d
发帖数: 1340
5
这些是啥意思?

【在 r****t 的大作中提到】
: translation unit, compilation unit.
r****t
发帖数: 10904
6
vs 编译的时候应该有命令行显示的吧,那一行里面能保证一次,多行里面 header
guard 可没办法。 你要是尝试过用命令行/make 来编译应该明白的。
哇塞,你看了 c++ primer 的,你比我牛了,我还是不说了。


primer学的

【在 k*******d 的大作中提到】
: 问题是,我有header guard,那么这个header的实际内容(也就是#ifndef #define 和
: #endif之间的内容)只会被include一次吧,那么应该
: function也只被define了一次啊
: declare可以多次?应该也只能一次吧,完全一样的函数重复声明编译就会有错误
: 名词使用问题我改改吧,应该叫做function template比较确切,我是自己看C++ primer学的
:
: 以可以多
: 准了。
: 拿准

r****t
发帖数: 10904
7
search 下巴,我也只是听过这些名词,随便和自己理解套了一下,给你说就怕误导了。

【在 k*******d 的大作中提到】
: 这些是啥意思?
t****t
发帖数: 6806
8
http://cs.calvin.edu/books/c++/C++Standard-Nov97/basic.html#basic.def.odr
http://cs.calvin.edu/books/c++/C++Standard-Nov97/lex.html#lex.phases
没听说过意味着你听说得太少了。

放在
already
cpp文件的
还只有一个cpp
里面去link

【在 k*******d 的大作中提到】
: 我知道一般情况下都是在header里面declare function, 在cpp里面define
: function,inline function 和 function template要放在header里面。
: 不过我最近写一个程序,把class definition以及member function的definition都放在
: header里面,有一些member function不是function template ,有一些是function
: template,结果link的时候出现错误,说那些不是function template的function "already
: defined in"某另外一个obj文件,这个情况是在我一个project(VC 2008)里面有多个cpp文件的
: 时候出现的。刚写完这个class的时候我用了个简短的测试程序,那时候整个project还只有一个cpp
: 文件,就没有出现这个错误。而我把这些member function definition移到cpp文件里面去link
: 的错误就没了。
: 另外,在另一个header里面我还定义了个non-membe

z****e
发帖数: 2024
9
header guard只是保证你同一个文件unit包含只一次。你的问题是被不同文件包含了。
而且不一定在cpp里边,在library里边也可以。
你对文件组织结构的理解还是混乱的。需要重新来过。


primer学的

【在 k*******d 的大作中提到】
: 问题是,我有header guard,那么这个header的实际内容(也就是#ifndef #define 和
: #endif之间的内容)只会被include一次吧,那么应该
: function也只被define了一次啊
: declare可以多次?应该也只能一次吧,完全一样的函数重复声明编译就会有错误
: 名词使用问题我改改吧,应该叫做function template比较确切,我是自己看C++ primer学的
:
: 以可以多
: 准了。
: 拿准

k*******d
发帖数: 1340
10
不敢不敢,我只看过C++ primer,而这个问题正好那上面没讲,没讲我就蒙了。。
那本书侧重将语言本身而没有讲多少文件结构。

【在 r****t 的大作中提到】
: vs 编译的时候应该有命令行显示的吧,那一行里面能保证一次,多行里面 header
: guard 可没办法。 你要是尝试过用命令行/make 来编译应该明白的。
: 哇塞,你看了 c++ primer 的,你比我牛了,我还是不说了。
:
: 和
: primer学的

k*******d
发帖数: 1340
11
顿悟了!我原来对header guard的理解不准确,它不能保证一个header不被多个cpp所
包含。看了thrust大牛给的C++标准之后明白了, non-inline function 在一个程序里
面只能出现一次,所以不能定义在header里面。而inline和function template是可以
的。
平时用C++的时候只是按照convention来,没有学好更深层次的东西。

【在 z****e 的大作中提到】
: header guard只是保证你同一个文件unit包含只一次。你的问题是被不同文件包含了。
: 而且不一定在cpp里边,在library里边也可以。
: 你对文件组织结构的理解还是混乱的。需要重新来过。
:
: 和
: primer学的

k*******d
发帖数: 1340
12
Thanks! Very helpful!

【在 t****t 的大作中提到】
: http://cs.calvin.edu/books/c++/C++Standard-Nov97/basic.html#basic.def.odr
: http://cs.calvin.edu/books/c++/C++Standard-Nov97/lex.html#lex.phases
: 没听说过意味着你听说得太少了。
:
: 放在
: already
: cpp文件的
: 还只有一个cpp
: 里面去link

1 (共1页)
进入Programming版参与讨论
相关主题
Question about friend in C++问低级问题
有关 template function 的一个问题弱问c++里有没有NULL这个keyword?
C++ template questionC++ Template Question
[合集] 又被羞辱了一把... (转载)recursive template?
Help C++ Template function link error .又一个初级问题: C++中多如牛毛的#define格式
forward declarationC 里面有办法永久改变一个指针的属性吗?
interview question: make all class member functions virtual (转载)inline functions in C++
一道面试怪题C++. (转载)c++头文件太tmd恶心了
相关话题的讨论汇总
话题: function话题: header话题: 里面话题: template话题: cpp