簡體   English   中英

動態使用 c 中的結構

[英]Dynamically use a structure in c

在我的代碼中有多個結構,如結構_1、結構_2、結構_3等。我正在嘗試編寫一個宏,它將使我能夠 select 正確的結構(select 的結構基於另一個值)。 我不能透露確切的代碼......但它類似於這個

#include <stdio.h>

#define concat(X,Y)     X##_##Y
#define typename(X){\
    if(val==0)\
        concat(X,1)\
    else\
        concat(X,2)\
}

int val;

typedef struct  {
    int x;
    char c;
}structure_1;

typedef struct  {
    int y;
    char c;
}structure_2;

int main()  {
    val = 0;
    typename(structure) abc;
    abc.x = 0;
    printf("%d\n",abc.x);
}

這不起作用並且會出現問題

24  11  E:\DEV\concat.c [Error] expected expression before 'structure_1'
3   22  E:\DEV\concat.c [Note] in definition of macro 'concat'
24  2   E:\DEV\concat.c [Note] in expansion of macro 'typename'
25  2   E:\DEV\concat.c [Error] 'abc' undeclared (first use in this function)
25  2   E:\DEV\concat.c [Note] each undeclared identifier is reported only once for each function it appears in

使用 if-else 語句是一種選擇,但它必須在許多結構和許多地方完成,所以我想避免這種情況。 請建議我做錯了什么或任何其他方式。

您的宏不起作用的原因是它導致if (val == 0) structure_1; 它不會編譯,因為你沒有聲明一個變量。 abc部分沒有注入到宏中,所以它只出現在已處理的宏擴展的末尾: abc只被聲明為structure_2的變量。

這很容易解決:您還必須將變量名稱作為宏的參數。 這樣做並且......現在這一點顯然已經被破壞了,因為你的變量只存在於 if-else 塊中,這是你不想要的。

在這一點上,很明顯這根本不是 C 的工作原理。 泛型沒有得到很好的支持,這是一件好事,因為泛型與 C 作為一種語言試圖實現的目標無關。 你應該問問自己為什么要強迫語言以這種方式表現。 您嘗試做的事情有什么意義?

無論如何,從某種意義上說,有一種方法可以解決這個問題:工會。 聯合允許您基本上將不同的類型組合成一種類型。 這有一個明顯的缺點,即強制從聯合聲明的變量始終是最大類型的大小。 如果你從一個 1 字節的 char 和一個 100 字節的結構體中創建一個聯合,則聲明的每個變量將總是消耗 100 字節。 另一方面,如果您將相同大小的結構拼湊在一起,則沒有特別的懲罰。

一個簡單的演示:

struct t {
    union {
        int x; float y;
    };
};
int main() {
    struct t a = {0};
    printf("%d\n", a.x);
    printf("%d\n", a.y);
    printf("%d\n", sizeof(a)); // 4
    return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM