簡體   English   中英

什么時候用固定索引宏填充數組比增加索引更好?

[英]When is it better to populate an array with fixed index macros vs by incrementing an index?

什么時候走這條路比較好

#define PREFIX_IDX 0
#define SUFFIX_IDX 1
#define ARRAY_DATA_SIZE 2

int data[ARRAY_DATA_SIZE ] = 0;

int main() {
  data[PREFIX_IDX] = 6;
  data[SUFFIX_IDX] = 19;
  return 0;
}

和....相比

#define ARRAY_DATA_SIZE 2

int data[ARRAY_DATA_SIZE ] = 0;

int main() {
  uint8_t currIdx = 0;
  data[currIdx++] = 6;
  data[currIdx++] = 19;
  return 0;
}

有人告訴我使用小數組最好使用固定的宏,但我覺得它不能很好地擴展。 對此的一般建議是什么?

您應該盡可能避免使用宏,在這種情況下是可能的。 如果你至少使用 C++11(你應該使用),你可以使用constexpr在編譯時聲明你的魔法常量:

static inline constexpr auto PREFIX_IDX = 0u;
static inline constexpr auto SUFFIX_IDX = 1u;
static inline constexpr auto ARRAY_DATA_SIZE = 2u;

也就是說,您需要將您的代碼與您正在做的事情的語義相匹配。 這使您的代碼更具可讀性。 數組的大小無關緊要。 重要的是您是否為數組的不同元素附加了不同的含義。

您已將“前綴”的語義標記附加到data[0]並將“后綴”之一附加到data[1] 由於數組的元素具有魔法角色,您應該使用魔法常量來索引它們。

int data[ARRAY_DATA_SIZE];

int main() 
{
   data[PREFIX_IDX] = 6;
   data[SUFFIX_IDX] = 19;
   return 0;
}

根據實際代碼的復雜程度,最好完全放棄數組並使用單獨的變量。 但是,我有一些代碼,您必須在一個地方將事物視為相同類型的事物,而在另一個地方則將事物視為不同類型,因此數組絕對可以。

添加斯賓塞所說的(不要使用#define ):

實際上,最好使用枚舉類型。 當您想引用特定的字段時,這個習慣用法可以讓您獲得命名字段的好處,但如果您想處理它們,仍然可以讓您迭代它們。

但是,使用不同的枚舉類型,您可以將它包裝在一個實現operator[]的類中,並確保您使用這些枚舉作為下標,而不是任意值。

即使您不這樣做,它也可以表明名稱在一個組中是相關的,並且在您定義它們時會自動增加它們。


另外, int data[ARRAY_DATA_SIZE ] = 0; 令人困惑。 您正在使用 int 初始化一個數組,並且特殊值為零。 不是指針。 無論如何,全局整數數組將被清零。 那這是為了什么? 這是一個錯誤嗎? 讀者會疑惑。


當然,這可能是 X-of-Y 問題。 如果你像這樣遞增:

  uint8_t currIdx = 0;
  data[currIdx++] = 6;
  data[currIdx++] = 19;

正確的答案是使用聚合來完成所有操作,而根本不增加下標。

  constexpr int vals[] = {6,19};
  std::ranges::copy (vals, data.begin());

如果您使用std::array而不是原始數組語法,並且您總是要提供整個內容,那么您可以只使用一個普通的賦值。

暫無
暫無

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

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