C語言---一些特殊的用法(函式排程表、變數附加屬性)
阿新 • • 發佈:2020-12-26
技術標籤: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(語句太複雜,無法分析),把這裡的巨集定義當做函式,無法跳轉。(不好用)
#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;
}
執行結果如圖: