假設(shè)有一個(gè)C程序,需要?jiǎng)?chuàng)建很多結(jié)構(gòu)體來(lái)記錄各個(gè)學(xué)生的信息,然后統(tǒng)一的將這些學(xué)生的信息打印出來(lái)。

例如 例如下述程序創(chuàng)建了A同學(xué)的記錄

#include <stdio.h>t" />

国产成人精品无码青草_亚洲国产美女精品久久久久∴_欧美人与鲁交大毛片免费_国产果冻豆传媒麻婆精东

18143453325 在線咨詢 在線咨詢
18143453325 在線咨詢
所在位置: 首頁(yè) > 營(yíng)銷資訊 > 建站知識(shí) > C語(yǔ)言使用連接符##來(lái)優(yōu)雅的創(chuàng)建多個(gè)結(jié)構(gòu)體

C語(yǔ)言使用連接符##來(lái)優(yōu)雅的創(chuàng)建多個(gè)結(jié)構(gòu)體

時(shí)間:2023-02-20 04:42:02 | 來(lái)源:建站知識(shí)

時(shí)間:2023-02-20 04:42:02 來(lái)源:建站知識(shí)

C語(yǔ)言使用連接符##來(lái)優(yōu)雅的創(chuàng)建多個(gè)結(jié)構(gòu)體:

問題的背景


假設(shè)有一個(gè)C程序,需要?jiǎng)?chuàng)建很多結(jié)構(gòu)體來(lái)記錄各個(gè)學(xué)生的信息,然后統(tǒng)一的將這些學(xué)生的信息打印出來(lái)。

例如 例如下述程序創(chuàng)建了A同學(xué)的記錄

#include <stdio.h>typedef struct { char name[20]; int age; int score; int grade;}Student;Student A = { "petter", 8, 90, 1,};Student * studentList[] = { &A,};int main(void){ for(int i=0;i<sizeof(studentList)/sizeof(Student *);i++){ printf("name = %s,age = %d,score = %d,grade = %d/r/n", / studentList[i]->name,studentList[i]->age,studentList[i]->score,studentList[i]->grade); } return 0;}現(xiàn)在人數(shù)變多了,增加了三個(gè)人的數(shù)據(jù)信息,分別是一年級(jí)學(xué)生lucy還有兩個(gè)二年級(jí)學(xué)生nancy和matt。

#include <stdio.h>typedef struct { char name[20]; int age; int score; int grade;} Student;Student petter = { "petter", 8, 90, 1,};Student lucy = { "lucy", 8, 100, 1,};Student nancy = { "nancy", 9, 60, 2,};Student matt = { "matt", 9, 55, 2};Student *studentList[] = {&petter, &lucy, &nancy, &matt};int main(void) { for (int i = 0; i < sizeof(studentList) / sizeof(Student *); i++) { printf("name = %s,age = %d,score = %d,grade = %d/r/n", studentList[i]->name, studentList[i]->age, studentList[i]->score, studentList[i]->grade); } return 0;}這個(gè)時(shí)候我們發(fā)現(xiàn),四個(gè)學(xué)生,聲明結(jié)構(gòu)體的代碼就很長(zhǎng)了,不好看。如果來(lái)了更多的學(xué)生數(shù)據(jù),那豈不是代碼越來(lái)越長(zhǎng)了嗎?多一個(gè)學(xué)生數(shù)據(jù)會(huì)多6行。那么如何用一個(gè)更好的寫法來(lái)優(yōu)雅的解決這個(gè)問題呢?

C語(yǔ)言連接符 "##"

#include <stdio.h>int algorithm_add_op(int num1, int num2) { return num1+num2;}int algorithm_sub_op(int num1, int num2) { return num1 - num2;}#define ALGORITHM(name, num1, num2) / algorithm_##name##_op(num1, num2)int main() { printf("%d/n", ALGORITHM(add, 1, 2)); printf("%d/n", ALGORITHM(sub, 1, 2)); return 0;}看上述代碼 ALOGORITHM函數(shù)把輸入的子串和algorithm和_op連接起來(lái),使得編譯器調(diào)度到對(duì)應(yīng)二點(diǎn)操作函數(shù)
可以看到"##"的作用,就是將兩個(gè)子串連接起來(lái)。

使用連接符來(lái)簡(jiǎn)化起始問題

#include <stdio.h>typedef struct { char name[20]; int age; int score; int grade;}Student;#define DECLARE_GRADE_1_AGE_8_STUDENT(name,score) / static const Student Student_##name = { / #name,8,score,1 / };#define DECLARE_GRADE_2_AGE_9_STUDENT(name,score) / static const Student Student_##name = { / #name,9,score,2 / };#define DECLARE_STUDENT(name,age,score,grade) / static const Student Student_##name = { / #name,age,score,grade / };DECLARE_GRADE_1_AGE_8_STUDENT(petter,90)DECLARE_GRADE_1_AGE_8_STUDENT(lucy,100)DECLARE_GRADE_2_AGE_9_STUDENT(nancy,60)DECLARE_GRADE_2_AGE_9_STUDENT(matt,55)Student const * studentList[] = { &Student_petter, &Student_lucy, &Student_nancy, &Student_matt};int main(void){ for(int i=0;i<sizeof(studentList)/sizeof(Student *);i++){ printf("name = %s,age = %d,score = %d,grade = %d/r/n", / studentList[i]->name,studentList[i]->age,studentList[i]->score,studentList[i]->grade); } return 0;}上述代碼我們定義了一個(gè)宏,這個(gè)宏有兩個(gè)輸入?yún)?shù),作用是創(chuàng)建一個(gè)結(jié)構(gòu)體變量,通過name來(lái)給這個(gè)結(jié)構(gòu)體變量命名,結(jié)構(gòu)體名稱使用到了連接符。
在第一個(gè)元素name中使用了另一個(gè)連接符 # 把petter這樣的token轉(zhuǎn)化為了字符串。

這樣寫法的優(yōu)勢(shì)在于

  1. 整合了不同的結(jié)構(gòu)體相同的部分,減少代碼長(zhǎng)度,例如都是8歲和一年級(jí),就一并使用DECLARE_GRADE_1_AGE_8_STUDENT來(lái)聲明,如果不希望分類,那么宏的輸入?yún)?shù)增加數(shù)量就可以了(DECLARE_STUDENT)。
  2. 簡(jiǎn)潔,從前新增一個(gè)學(xué)生結(jié)構(gòu)體,需要很多代碼,不漂亮,現(xiàn)在只需要調(diào)用一個(gè)聲明宏,就可以優(yōu)雅的創(chuàng)建結(jié)構(gòu)體。
這樣的寫法可以用來(lái)描述一些只讀的信息,甚至可以把這些代碼放到頭文件中也不會(huì)顯得突兀。有非常多的優(yōu)點(diǎn)。

這樣的寫法你學(xué)到了嗎?如果你也覺得代碼漂亮,或者眼前一亮,是否點(diǎn)個(gè)贊呢?

關(guān)鍵詞:創(chuàng)建,結(jié)構(gòu),連接,使用,語(yǔ)言

74
73
25
news

版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。

為了最佳展示效果,本站不支持IE9及以下版本的瀏覽器,建議您使用谷歌Chrome瀏覽器。 點(diǎn)擊下載Chrome瀏覽器
關(guān)閉