首先A代碼:函數
struct.h(A的結構體定義)
測試
#ifndef __STRUCT_H__ #define __STRUCT_H__ typedef struct _MyStruct { int iAge; char* pName; }ST_MY_STRUCT,*PST_MY_STRUCT; #endif
Method.h(A提供給B的頭文件)spa
#ifndef __METHOD_H__ #define __METHOD_H__ typedef struct _MyStruct _MyStruct_t; //這裏注意一下,下文中會解釋這句話 void vPrintf(_MyStruct_t* pstMyStruct); //供B調用,輸出結構體信息 _MyStruct_t* stCreateStruct(int iAge, const char* pName); //供B調用,生成結構體 #endif
Method.cpp(A函數實現)指針
#include "Method.h" #include <stdio.h> #include <string.h> #include <stdlib.h> #include "struct.h" void vPrintf(_MyStruct_t* pstMyStruct) { if (!pstMyStruct) { printf("the struct is null\n"); return; } printf("Age:%d----Name:%s\n", pstMyStruct->iAge, pstMyStruct->pName); } _MyStruct_t* stCreateStruct(int iAge, const char* pName) { _MyStruct_t* pstMyStruct = (_MyStruct_t*)malloc(sizeof(_MyStruct_t)); memset(pstMyStruct, 0, sizeof(_MyStruct_t)); pstMyStruct->iAge = iAge; int iSize = strlen(pName) + 1; pstMyStruct->pName = (char*)malloc(iSize); memcpy(pstMyStruct->pName, pName, iSize); return pstMyStruct; }
A將代碼編譯以後生成Lib文件(LibTest.lib),將Method.h和LibTest.lib兩個文件提供給B。code
-------------------------------------------以上爲A代碼,如下爲B代碼-------------------------------------------orm
B將A提供的頭文件和lib文件加入工程。
string
B調用Lib的代碼:
it
#include "Method.h" int main(int argc, char* agrv[]) { _MyStruct_t* pstMyStruct = stCreateStruct(10, "china"); vPrintf(pstMyStruct); free(pstMyStruct); return 0; }
------------------------------------------我是華麗的分割線------------------------------------------------------io
typedef struct _MyStruct _MyStruct_t 這句代碼爲B提供了使用結構體的定義,可是B只能使用結構體指針,而不能直接使用結構體,且沒法接觸到結構體中的成員,從而實現告終構體的不透明化。根據我的理解,這裏用到的應該只是一個指針,不管什麼指針均可以,即便定義成 typedef int _MyStruct_t,依然可以編譯運行(VS下測試經過)。編譯