1. 程式人生 > >關於用typedef定義結構體型別

關於用typedef定義結構體型別

很痛苦啊,剛把動態連結庫搞定,今天呼叫DSOpenProject函式又出現了錯誤。用dlerror函式輸出錯誤資訊,說是”Function not implemented (DSOpenProject)“。暈,怎麼可能沒實現呢,庫函式裡不都有麼。

扯遠了。開始我以為是資料型別有錯誤,開啟dsapi.h,找到了DSPROJECT型別的定義處:

typedef struct _DSPROJECT
{
    int dsapiVersionNo;        /* Version of DSAPI being used */
    int sessionId;        /* The InterCALL session id */
    unsigned char valueMark;    /* This sessions value mark character */
    unsigned char fieldMark;    /* This sessions field mark character */
} * DSPROJECT;

我C++小菜啊!按小菜的理解,_DSPROJECT是定義的結構體資料型別名,而DSPROJECT是一個指向_DSPROJECT型別的指標變數。可是,在標頭檔案裡定義變數幹嘛呢???

百度了下,找到一篇講用typedef定義結構體型別的文章,貼上如下:

(原文:http://blog.csdn.net/eion/archive/2003/05/30/14548.aspx)

#define S(s) printf("%s/n", # s); s

typedef struct _TS1{

int x, y;

} TS1 , *PTS1 , ***PPPTS1 ; // TS1 是結構體的名稱,

PTS1 是結構體指標的名稱

// 也就是將結構體 struct _TS1 命名為 TS1,

// struct _TS1 * 命名為 PTS1

// struct _TS1 *** 命名為 PPPTS1

typedef struct { // struct 後面的結構體說明也可以去掉

int x, y;

} TS2 , *PTS2 ;

typedef PTS1 *PPTS1 ; // 定義 PPTS1 是指向 PTS1 的指標

typedef struct _TTS1 {

typedef

struct ITTS1 {

int x, y;

} iner ;

iner i;

int x, y;

} TTS1;

// 結構體內部的結構體也一樣可以定義

typedef TTS1 ::ITTS1 ITS1 ;

void test_struct()

{

// 基本結構體重定義的使用

TS1 ts1 = {100, 200};

PTS1 pts1 = &ts1; // 完全等價於 TS1* pts1 = &ts1;

PPTS1 ppts1 = &pts1; // 完全等價於 TS1** ppts1 = &pts1;

PPPTS1 pppts1 = &ppts1; // 完全等價於 TS1*** pppts1 = &ppts1;

TS2 ts2 = {99, 88};

PTS2 pts2 = &ts2; // 完全等價於 TS2* pts2 = &ts2;

TTS1 itts1 = {{110, 220}, 10, 20};

Its1 * rits1 = &itts1.i;

ITS1 * & its1 = rits1; // 等價於 TTS1::ITTS1 *its1 = &(itts1.i);

printf("ts1/t = (%d, %d)/n*pts1/t = (%d, %d)/n"

"**ppts1/t = (%d, %d)/n***pppts1= (%d, %d)/n/n" ,

ts1.x, ts1.y, pts1->x, pts1->y,

(**ppts1).x, (**ppts1).y, (***pppts1).x, (***pppts1).y);

printf("ts2/t = (%d, %d)/n*pts2/t = (%d, %d)/n/n" ,

ts2.x, ts2.y, pts2->x, pts2->y);

printf("itts1/t = [(%d, %d), %d, %d]/n*its1/t = (%d, %d)/n/n" ,

itts1.i.x, itts1.i.y, itts1.x, itts1.y, its1->x, its1->y);

S(pts1->x = 119);

S(pts2->y = 911);

S(its1->x = 999);

printf("ts1/t = (%d, %d)/n*pts1/t = (%d, %d)/n"

"**ppts1/t = (%d, %d)/n***pppts1= (%d, %d)/n/n" ,

ts1.x, ts1.y, pts1->x, pts1->y,

(**ppts1).x, (**ppts1).y, (***pppts1).x, (***pppts1).y);

printf("ts2/t = (%d, %d)/n*pts2/t = (%d, %d)/n/n" ,

ts2.x, ts2.y, pts2->x, pts2->y);

printf("itts1/t = [(%d, %d), %d, %d]/n*its1/t = (%d, %d)/n/n" ,

itts1.i.x, itts1.i.y, itts1.x, itts1.y, its1->x, its1->y);

S((*ppts1)->y = -9999);

printf("ts1/t = (%d, %d)/n**ppts1/t = (%d, %d)/n/n" ,

ts1.x, ts1.y, (*ppts1)->x, (*ppts1)->y);

S((**pppts1)->x = -12345);

S((***pppts1).y = -67890);

printf("ts1/t = (%d, %d)/n*pts1/t = (%d, %d)/n"

"**ppts1/t = (%d, %d)/n***pppts1= (%d, %d)/n/n" ,

ts1.x, ts1.y, pts1->x, pts1->y,

(**ppts1).x, (**ppts1).y, (***pppts1).x, (***pppts1).y);

}

按上文所講,DSPROJECT也是資料型別名,它是一個指向_DSPROJECT資料體型別的指標型別。這樣就make sense了。

typedef struct _DSPROJECT
{
    int dsapiVersionNo;        /* Version of DSAPI being used */
    int sessionId;        /* The InterCALL session id */
    unsigned char valueMark;    /* This sessions value mark character */
    unsigned char fieldMark;    /* This sessions field mark character */
} * DSPROJECT;

這麼基礎的東西我都還不知道,曉習路漫漫啊。。。

相關推薦

關於typedef定義結構型別

很痛苦啊,剛把動態連結庫搞定,今天呼叫DSOpenProject函式又出現了錯誤。用dlerror函式輸出錯誤資訊,說是”Function not implemented (DSOpenProject)“。暈,怎麼可能沒實現呢,庫函式裡不都有麼。 扯遠了。開始我以為是資料

type定義的列舉型別結構

1.用typedef定義列舉型別 typedef enum{ GPIO_Mode_AIN = 0x00, GPIO_Mode_IN_FLOATING = 0x04, GPIO_Mode_IPD = 0X28, GPIO_Mode

QT:QSet儲存自定義結構的問題

前幾天要用QSet作為儲存一個自定義的結構體(就像下面這個程式一樣),結果死活不成功。。。後來還跑到論壇上問人了,丟臉丟大了。。。 事先說明:以下這個例子是錯誤的 [cpp] view plaincopyprint? #include <QtCore> struct node

C語言結構typedef關鍵字定義結構別名和函式指標的應用

結構體(struct)的初始化 struct autonlist { char *symbol; struct nlist nl[2]

typedef結構變數的定義方法

首先請看程式:#include<stdio.h> #include<string.h> #pragma pack(4) /*struct { int num ; char name[8]; char sex; double score[2]; }st

關於Go語言,自定義結構標籤的一個妙.

在Go中首字母大小寫,決定著這此變數是否能被外部呼叫, 例如:在使用標準庫的json編碼自定一的結構的時候: <pre style="margin-top: 0px; margin-bottom: 0px;"><span style=" font-weig

為什麼要 “ __attribute__ ((__packed__)) ” 定義結構

首先,解釋下 “__attribute__ ((__packed__))” 是做什麼的? 我們知道,通常定義一個U32 ,CPU 期望 這個 U32 地址是 DW 對齊的, 這樣對CPU訪問 mem bus 比較友好。 所以,當我們定義這樣一個結構體: struct

定義結構時的初始化默認值

sans post 建議 src pre 問題: -h ber 保險 結構體變量定義時的初始化問題: 默認值同變量一樣。int型的為0,指針型的為“NULL”------------並非整個結構體為NULL。當中的int型還是有值0的,僅僅是指針型的為NULL 驗證一下

定義結構變量及初始化

style 不想 占用空間 clas 個學生 truct 學生 釋放 ring   雖然已經了解結構體類型,但是結構體類型變量的定義只有一種方法麽,這個當然不是的,所以我把我所知道的幾種方法列出來供給大家參考一下;   首先是第一種,也是我們經常用的一種: 1 #inc

定義結構做為map裡面的key的寫法

其中一種寫法: struct hook_info { string lib_name; string fun_name; int param_count; bool bIATHook; hook_info(char *lib

定義結構的對齊問題

一、跨平臺通用資料型別 之前的一篇部落格Linux資料型別(通用移植),已經自定義嘗試解決了資料通用型別問題。 這裡通過原始碼進行分析,利用原始碼進行解決問題。在<stdint.h>中我們發現: typedef signed char int8_t; typedef

關於定義結構的應用

define _CRT_SECURE_NO_WARNINGS include <stdio.h> include <stdlib.h> include <string.h> //# include<str .h> struct

c語言typedef結構指標

轉載部落格:https://blog.csdn.net/developerof/article/details/24885205?utm_source=blogxgwz0  #include<stdio.h> #include<

定義結構及初始化

自定義結構體及初始化,以及標頭檔案先宣告巨集,然後宣告結構體 <pre name="code" class="cpp">/********************** macro definition **********************/ #ifndef CVALGO_

Golang 之 面向物件struct ,定義結構方法(二)

package main import "fmt" type treeNode struct { value int left, right * treeNode } // 給結構體定義列印方法,其中(node treeNode)表示該方法的接受者是那個結構體 fun

定義結構時的初始化預設值

結構體變數定義時的初始化問題: 預設值同變數一樣,int型的為0,指標型的為“NULL”------------並不是整個結構體為NULL,其中的int型還是有值0的,只是指標型的為NULL #include <iostream> using namespace std; st

指標輸出結構陣列【轉】

  (轉自:https://wenku.baidu.com/view/6511f01477c66137ee06eff9aef8941ea76e4bac.html) #include <stdio.h>  #include <string.h> #includ

C++ 自定義結構的Priority Queue

比較函式return true 意味著排序需要交換。   #include <iostream> #include <queue> #include <vector> #include <algorithm> using namespace

利用qt 訊號槽傳遞自定義結構--藉助QVariant

在前面的部落格裡,我介紹了利用Q_DECLARE_METATYPE和qRegsterMetaType來傳遞自定義的結構體。但是這樣做有個缺點:qRegisterMetaType()只能在main()函式裡才能發揮作用。https://blog.csdn.net/Kelvin_Yan/article/

QT訊號槽傳遞自定義結構

QT的訊號槽可以傳遞int, short, double等c語言的常用型別的變數,也可以傳遞如QImage之類的QT支援 的型別。但是如何傳遞一個程式設計師自定義的結構體? 1)在定義結構體之後,要呼叫Q_DECLARE_METATYPE,向QT宣告這個結構體 2)在main.cpp 中,用