簡體   English   中英

C用現有的const變量初始化const struct成員

[英]C initialize const struct member with existing const variable

我在gcc下使用默認的C語言。

我的代碼:

typedef struct _OpcodeEntry OpcodeEntry;

//

struct _OpcodeEntry
{
    unsigned char uOpcode;
    OpcodeMetadata pMetadata;
};

//

const OpcodeMetadata omCopyBytes1 = { 1, 1, 0, 0, 0, 0, &CopyBytes };

const OpcodeEntry pOpcodeTable[] =
{
    { 0x0, omCopyBytes1 },
};

錯誤:

error: initializer element is not constant
error: (near initialization for 'pOpcodeTable[0].pMetadata')

如果我將omCopyBytes1更改為它在上面的行中實際設置的內容,則代碼編譯正常。 我究竟做錯了什么?

您不能使用omCopyBytes1初始化pOpcodeTable[]數組的成員,因為omCopyBytes1是一個運行omCopyBytes1量的變量,而不是編譯時常量。 C中的聚合初始值設定項必須是編譯時常量,這就是你的帖子中的代碼無法編譯的原因。

作為變量, omCopyBytes1在內存中有自己的位置,它被初始化為一個項目數組。 您可以通過指針使用此類變量,如下所示:

struct _OpcodeEntry {
    unsigned char uOpcode;
    const OpcodeMetadata *pMetadata;
};
...
const OpcodeEntry pOpcodeTable[] = {
    { 0x0, &omCopyBytes1 }, // This should work
};

或者,您可以使其成為預處理器常量:

#define omCopyBytes1 { 1, 1, 0, 0, 0, 0, &CopyBytes }

如果以這種方式定義, omCopyBytes1將不再是變量:它將是在編譯器完成之前消失的預處理器定義。 我建議不要使用預處理器方法,但是如果你必須這樣做的話。

在C中,靜態存儲持續時間對象的初始化程序必須是常量表達式 const -qualified變量不是常量表達式。

暫無
暫無

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

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