總結學習 前置定義

2021-07-28 20:59:42 字數 1440 閱讀 4144

當在乙個很大的工程中,需要隱藏結構體中的內容,或者中介軟體給使用者的介面,不希望使用者知道結構體的內容形式,那麼,請使用前置定義。

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