1. 程式人生 > 其它 >C語言---一些特殊的用法(函式排程表、變數附加屬性)

C語言---一些特殊的用法(函式排程表、變數附加屬性)

技術標籤:C語言

記錄一些第一次見到感到奇怪(少見多怪)的C語句。編譯器GNU gcc。

一、函式排程表

原理:定義特定格式的函式指標,再定義函式指標陣列。然後把一個個函式指標(即函式名、函式地址),然後就可以像操控陣列一樣操控一堆函數了。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define pint(t)   printf("the func is:%d\n",t);

void print1(int);
void print2(int);
void
print3(int); void print4(int); typedef void(*print_fun)(int); int main(void) { int i; print_fun pointer_funs[4]={print1,print2,print3,print4}; for(i=0;i<4;i++) { pointer_funs[3-i](i); } return 0; } void print1(int a){ printf("hello,input %d :",a); pint(1); } void print2
(int a){ printf("hello,input %d :",a); pint(2); } void print3(int a){ printf("hello,input %d :",a); pint(3); } void print4(int a){ printf("hello,input %d :",a); pint(4); }

執行結果如圖:
在這裡插入圖片描述

二、給定義的變數附加一些屬性

原理:通過巨集定義的方法,加上一些類別的屬性。
注:
在用程式碼閱讀工具,sourceinsight的時候,當出現了這樣的程式碼。它會報Parse too Complex(語句太複雜,無法分析),把這裡的巨集定義當做函式,無法跳轉。(不好用)

但是Scitool Understand就不一樣了,直接自動把一些複雜的巨集定義解析出來,解析出是變數的型別的定義而不是什麼函式,閱讀程式碼十分方便。(優點不止於此)


#include <stdio.h>

/* AUTOMATIC 用來宣告本地指標 */
# define AUTOMATIC

/* TYPEDEF 應該用來宣告型別定義*/
# define TYPEDEF

/* STATIC 編譯器的關鍵字 */
#  define STATIC       static

/*
  rettype : 返回的型別
  ptrtype :指標的型別
  type    :型別
  vartype :變數的型別
  
  memclass: 所屬的類別
  ptrclass:指標的類別
*/

/* 函式返回變數型別 */
# define FUNC(rettype, memclass) memclass rettype

/* 函式返回指向const的指標型別 */
# define FUNC_P2CONST(rettype, ptrclass, memclass) const rettype ptrclass * memclass 

/* 函式返回指標型別 */
# define FUNC_P2VAR(rettype, ptrclass, memclass)  rettype ptrclass * memclass 

/* 指標的型別 */
# define P2VAR(ptrtype, memclass, ptrclass) ptrtype ptrclass * memclass

/* 指向const的指標的型別 */
# define P2CONST(ptrtype, memclass, ptrclass) const ptrtype ptrclass * memclass

/* const指標的型別 */
# define CONSTP2VAR(ptrtype, memclass, ptrclass) ptrtype ptrclass * const memclass 

/* 指向const的const指標的型別 */
# define CONSTP2CONST(ptrtype, memclass, ptrclass) const ptrtype ptrclass * const memclass

/* 指向函式的指標的型別 */
# define P2FUNC(rettype, ptrclass, fctname) rettype ( * ptrclass fctname)

/* const變數型別 */
# define CONST(type, memclass) memclass const type 

/* 變數型別 */
# define VAR(vartype, memclass) memclass vartype


#define myCode_1
#define MAIN_C
FUNC(void,myCode_1) myCode_PrintFun( CONSTP2CONST(char,myCode_1,MAIN_C) );

int main(void)
{
    myCode_PrintFun("abcdef");
    return 0;
}

FUNC(void,myCode_1) myCode_PrintFun( CONSTP2CONST(char,myCode_1,MAIN_C) iString) {
    printf("%s\n",iString);
}

執行結果如圖:
在這裡插入圖片描述

三、結構體初始化

C語言標準用法

#include <stdio.h>
#define pint(a) printf("The int is:%d\n",a)
typedef struct{
    int a;
    int b;
}myStruct;
int main(void)
{
    myStruct aTest[2]={
        {
            .a=555,
            .b=666,
        },
        {
            .a=333,
            .b=444,
        },
    };
    
    pint(aTest[0].a);
    pint(aTest[0].b);
    pint(aTest[1].a);
    pint(aTest[1].b);
    return 0;
}

執行結果如圖:
在這裡插入圖片描述