基本原则:#include的文件就相当于粘贴了一份代码;”.h”文件里放数据结构struct定义、函数声明(全局可以被多次#include);”.cpp”文件里放函数定义(实现代码;全局只能被编译一次);
- TH/generic/THTensor.h: 数据结构定义和函数声明;使用以下开关来控制要定义宏指向自己,还是展开代码:
#ifndef TH_GENERIC_FILE
#define TH_GENERIC_FILE "TH/generic/THTensor.h"
#else
- TH/generic/THTensor.cpp: 函数定义(代码实现);还是用那个开关来控制,同时起到了自己不单独编译的作用(只被TH/THTensor.cpp进行#include,避免再次编译造车报错)
- TH/THTensor.h:
#define THTensor_(NAME) TH_CONCAT_4(TH,Real,Tensor_,NAME)
#include <TH/generic/THTensor.h> // 图的是该文件首部的#define TH_GENERIC_FILE "TH/generic/THTensor.h", 只定义上这个宏,不包含其里面的代码;
#include <TH/THGenerateAllTypes.h> // 该文件里先定义scalar_t和Real等宏对应实际值,再#include <TH/generic/THTensor.h>把代码放进来,再#undef scalar_t和Real等宏和TH_GENERIC_FILE宏;
#include <TH/generic/THTensor.h> // 每种数据类型写两行这个
#include <TH/THGenerateHalfType.h> // 这里变了
- TH/THTensor.cpp:先#include “TH/THTensor.h”,把所有类型声明放进来;再用两行一组法对每种数据类型进行代码生成(他每次#include的是<TH/generic/THTensor.cpp>);
THGeneral.h这个文件找不到,应该是由THGeneral.h.in这个文件生成的(在CMakeLists.txt里用configure_file来copy了一份);其中定义了TH_CONCAT_4等宏;