基本原則:#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等宏;