[英]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.