Wenn Sie wirklich müssen einen Makro für diese machen -., die, wie andere haben darauf hingewiesen, eine wirklich schlechte Idee ist und nicht die Richtige Vorgehensweise - Das Problem besteht darin, dass Makros vom Präprozessor interpretiert werden, der Zeilenumbrüche als Ende eines Makroersatzes behandelt ix dies, müssen Sie einige Escape-Sequenzen an den Enden der Linien vorstellen:
#define rm(A, m, n, type) \
for(int i = 0; i < m; i++) \
for(int j = 0; j < n; j++) \
scanf("%" #type, &A[i][j]);
Beachten Sie, dass ich habe Ihre Verwendung des Token-Einfügen Operator von der Innenseite der Kette herausgerechnet, da die preprocessor füllt keine Zeichenfolgenliterale für Sie aus und verwendet stattdessen den stringizing-Operator #
, um den Typ in ein Zeichenfolgenliteral zu konvertieren. Da der Compiler automatisch benachbarte Zeichenfolgenliterale miteinander verkettet, müssen Sie nichts einfügen. Ich sollte das wiederholen das ist eine wirklich schlechte Idee in dem es Code Lesbarkeit verletzt und bietet nichts, was Sie nicht bereits mit einer regulären C++ Funktion tun können.
Sie haben diese Frage als C++ getagt, obwohl ich darauf hinweisen sollte, dass scanf
alle Arten von Sicherheitsproblemen hat, die auftreten können, also ist es fast sicher sicherer, die iostream
-Bibliothek zu verwenden, die für alle ihre Fehler fängt eine Menge möglicher Fehler zur Kompilierzeit ab.
Grundsätzlich sollten Sie jedoch keine Makros dafür verwenden. Schreib einfach eine normale alte Funktion. Hier ist ein Weg, dies zu tun, was den zusätzlichen Vorteil hat, dass sie automatisch die Größe der Arrays folgert:
template <typename T, size_t m, size_t n>
void readArray(T (&array)[m][n], std::istream& source = std::cin) {
for (size_t i = 0; i < m; i++) {
for (size_t j = 0; j < n; j++) {
source >> array[i][j];
}
}
}
Jetzt können Sie so etwas wie dies sagen:
double arr[137][42];
readArray(arr);
eine Reihe von double
zu lesen s von cin
oder
int arr[5][5];
ifstream input("my-file.txt");
readArray(arr, input);
ein Array von int
s aus einer externen Datei zu lesen. Dies ist typsicher und verursacht einen Compilerfehler, wenn Sie versuchen, in einem Fall zu lesen, in dem die Array-Größe nicht definiert ist oder der Typ nicht gelesen werden kann. Dies verhindert alle möglichen Probleme.Vergleichen Sie dies mit Ihrem Makro, wo ich so etwas tun könnte:
int arr[5][5];
rm(arr, 6, 6, f);
Oops - I verwenden nur die falsche Feldgröße und die falschen scanf
Spezifizierer. Jedes Mal, wenn Sie Arbeit an den Compiler abladen können, die Sie daran hindert, Codeänderungen an vielen Stellen vorzunehmen, ist es eine Überlegung wert!
Makros sind böse. Machen Sie es zu einer Inline-Funktion. Beispielsweise können Sie mit Makros "Hello" als einen Parameter und "Frog" als Typ übergeben. –
BTW, die Verwendung von geschweiften Klammern, '{' und '}', haben keinen Einfluss auf die Laufzeit und haben einen vernachlässigbaren Effekt auf die Kompilierung. Benutze sie. Es ist ein Weg, um Defekte zu reduzieren. –
Ich denke, das Problem wird durch ein Zeichenliteral ersetzt. Möglicherweise müssen Sie die gesamte 'scanf'-Formatzeichenfolge übergeben. –