Initialisieren Sie das Array mit einem zusätzlichen Element mithilfe eines Makros


8

Ich initialisiere ein Array auf zwei verschiedene Arten, abhängig von einem Makro:

# if feature_enabled
const int v[4] = {1, 2, 3, 4};
#else
const int v[5] = {0, 1, 2, 3, 4};
#endif

Das Problem ist, dass die Daten in der Zuweisung tatsächlich große Matrizen sind und es aus verschiedenen Gründen keine gute Lösung ist, die Daten nur mit einer geringfügigen Änderung zu kopieren (nur ein weiteres Element am Anfang des Arrays).

Ich habe mich gefragt, ob es eine Möglichkeit gibt, das Gleiche wie hier zu tun, ohne die letzten n-1 Elemente im Wesentlichen zu duplizieren.


6
Wissen Sie, dass die Arraygröße nicht mit der Anzahl der Elemente in der Initialisierungsliste übereinstimmt?
mch

@mch hat es jetzt behoben, es war nur etwas, was ich für die Frage geschrieben habe.
CE

@CE "und aus verschiedenen Gründen ist es keine gute Lösung, die Daten nur mit geringfügigen Änderungen zu kopieren" - Können Sie uns eine Referenz dafür geben, worüber machen Sie sich Sorgen?
RobertS unterstützt Monica Cellio

@ RobertS-ReinstateMonica Warum ist das Duplizieren von Code im Allgemeinen schlecht? Das ist ein ziemlich breites Thema. Zum Glück habe ich trotzdem meine Antwort bekommen.
CE

@CE Sie brauchen keine zu detaillierte Erklärung abzugeben, es wäre in Ordnung, wenn Sie zumindest einen Verweis darauf geben könnten, worauf Sie zeigen und auf welcher Grundlage diese Frage steht. Leute, die mit diesen Dingen nicht bestätigt sind, können den Zweck dieser Frage verstehen.
RobertS unterstützt Monica Cellio

Antworten:


16

Wenn Sie die Größe des Arrays nicht angeben, es aber automatisch ableiten lassen, können Sie die 0 vorne einfach bedingt hinzufügen:

const int v[] = {
# if feature_enabled
  0,
#endif
  1, 2, 3, 4
};

3

Wenn Sie die Arraygröße beibehalten müssen, dann:

# if feature_enabled
const int v[4] = {
#else
const int v[5] = {0,
#endif
  1, 2, 3, 4
};
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.