當在乙個很大的工程中,需要隱藏結構體中的內容,或者中介軟體給使用者的介面,不希望使用者知道結構體的內容形式,那麼,請使用前置定義。
#include
#include "test.h"
struct test *test;
void main(void)
#ifndef _test_h_
#define _test_h_
struct test *init(void);
void print(struct test * test);
#endif
#include
#include
struct test
;typedef
struct test *test;
test init(void)
void print(test test)
例子比較簡單,就三個檔案,其中main.c和test.h可以提供給別人,為了隱藏struct test結構體中的內容,將test.c檔案編譯成庫檔案。
編譯過程:
第一步:
gcc -o libtest.so -fpic -shared test.c
第二步:
gcc -o test main.c -l ./ -l test
第三步:
export ld_library_path=./
第四步:
執行程式 ./test
不出什麼意外會列印出正確結果,以上操作不需要root許可權。這時候,你將test.c檔案移走,別人就不會知道struct test中到底有什麼東西了,能夠在一定程度上實現結構體資料的保密。
注意點:
(1)在main.c中定義結構體的時候,要定義成指標型變數;如果定義成為非指標變數(如struct test test),那麼會報出「incomplete type」的錯誤。因為定義成為非指標變數的話,程式在編譯的時候會給變數分配空間,但是該變數是乙個「前置定義」的變數,不知道包還有什麼元素,所以會報錯;定義成為乙個指標後,直接分配乙個位址完事。
(2)既然是「incomplete type」,在main.c中是不能夠使用sizeof求出結構體的大小,即sizeof(struct test)會報錯。
(3)在main函式中定義的test指向null,所以不能夠直接使用,通過malloc分配記憶體後使用。
(4)切記不要這麼用:
void init(sruct test *test);
… void init(struct test *test)
這樣的話,在main函式中呼叫init函式,不會得到正確的結果。
敲**的路上需要積累,共勉。
類定義與前置宣告
本文要寫的是近期做專案過程中遇到的乙個語法方面的小問題,下文從問題描述,解決思路以及總結這樣的三段式描述來記錄一下,以為備忘。問題描述很簡單。在實現乙個模組的過程中,在標頭檔案x.h中定義了class b,class b繼承自class a class a定義在y.h中 為了避免兩個標頭檔案之間不同...
機箱前置USB接線的定義
機箱前置usb接線的定義 首先還是了解一下機箱上前置usb各個接線的定義。通常情況下,紅線 電源正極 接線上的標識為 5v或vcc 白線 負電壓資料線 標識為 data 或usb port 綠線 正電壓資料線 標識為 data 或usb port 黑線 接地 標識為 ground或gnd 某些機箱廠...
leetcode刷題前置知識總結
1 在乙個有序陣列中,找某個數是否存在 2 在乙個有序陣列中,找 某個數最左側的位置 3 在乙個有序陣列中,找 某個數最右側的位置 4 區域性最小值問題 查詢乙個數是否存在 package com.zy.class001 public class code04 b ist system.out.pr...