簡體   English   中英

宏都將獲取(void *)項的地址和長度,用於數組和結構

[英]Macro to both get (void*) address of item and length, for arrays and structs

我正在嘗試設計一個宏,以產生與需要初始化的事物相關的幾個相關數據結構。 該代碼必須在C和C ++下都可以編譯。 目的是要有類似的東西:

MUNGE_THING(struct1);
  MUNGE_THING(array1);

變成等同於

munge_thing((void*)&struct1, sizeof(struct1));
  munge_thing((void*)array1, sizeof(array1));

有什么語法上的東西可以包圍宏參數,以便在獲取地址和獲取大小時都能正確處理數組和結構? 最可能的上下文將在初始化列表的常量聲明中。

如果那是不可能的,並且有必要對結構和數組使用單獨的宏,那么什么是最好的語法來確保錯誤地傳遞某些內容會產生編譯錯誤而不是偽代碼?

在“舊” C中,在數組地址前加上“&”會產生警告,但不會阻止編譯。 在C ++中,似乎產生了存儲數組地址的位置的地址。

MUNGE_THING宏將位於另一個宏中,該宏將使用MUNGE_THING的不同定義多次調用,因此為數組和結構使用單獨的宏會很麻煩。 我能想到的最好的方法是給MUNGE_THING一個額外的參數來表示“可選”的“&”號,但是這看起來很難看。

如果數組實際上是一個數組( sizeof要正常工作似乎是必需的),為什么不只使用簡單的宏:

#define MUNGE_THING( x ) munge_thing((void*)&(x), sizeof(x))

這應該適用於數組和結構:

int array[10];
assert( (void*)array == (void*)&array );

您已將問題標記為C和C ++,在C ++中,您可以使用模板,並且避免一起使用宏。

我不確定&array1有什么問題。 此C ++完全按預期工作(所有值均相同)

int main(int argc, char* argv[])
{
    int array1[10];

    printf("%x %x\n", array1, &array1);
    cout << array1 << " " << &array1 << endl;

    void* ptr1 = array1;
    void* ptr2 = &array1;

    printf("%x %x\n", ptr1, ptr2);
    cout << ptr1 << " " << ptr2 << endl;
    return 0;
}

好吧,我看到了我的困惑。 在C ++中,&array的類型與數組的類型不兼容,並且正如鏈接的討論所指出的那樣,(&array)+1與(array + 1)不同,但是強制轉換未下標的指針確實會產生適當的結果。 C語言中的數組和指針之間的區別非常令人困惑。 感謝您的協助。

暫無
暫無

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

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