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 | |