Frage

Ich habe eine Frage in C gestern Abend gefragt, und ich weiß nicht, die Antwort, da ich nicht viel C seit dem College verwendet habe, so dass ich dachte, vielleicht könnte ich die Antwort hier, statt nur zu vergessen sie finden.

Wenn eine Person ein definieren, wie:

#define count 1

Kann diese Person den Variablennamen count mit dem 1 finden, die in ihm ist?

ich nicht zustimmten, da ich dachte, die Zählung zu dem Punkt 1 würde aber nicht sehen, wie die 1 zurück zu zählen zeigen könnte.

War es hilfreich?

Lösung

Die einfache Antwort ist nein, sie kann es nicht. #Defines so sind mit vom Präprozessor behandelt, und sie zeigen nur in eine Richtung. Natürlich ist das andere Problem ist, dass selbst die Compiler nicht wissen würden - als ein „1“ auf etwas zeigen könnte -. Mehrere Variablen den gleichen Wert in der gleichen Zeit haben

Andere Tipps

Aufbauend auf @Cade Roux Antwort, wenn Sie einen Präprozessor #define verwenden, um einen Wert mit einem Symbol zugeordnet wird, hat der Code keinen Hinweis auf das Symbol, wenn der Prä-Prozessor ausgeführt wird:

#define COUNT (1)
...
int myVar = COUNT;
...

Nach dem Prä-Prozessor läuft:

...
int myVar = (1);
...

So wie andere hier schon berichtet haben, dies im Grunde bedeutet, „nein“, für die oben genannten Gründe.

  
    

Kann feststellen, dass Person der Variablenname „count“ die 1 verwenden, die im Inneren ist?

  

Nein

Wie ich bin sicher, dass jemand mehr eloquent und versiert ist als ich # wird darauf hingewiesen define'd Dinge nicht in die Quelle zusammengestellt, was Sie haben, ist ein Pre-Prozessor-Makro, das durch die Quelle gehen und alle Instanz ändern von 'count' findet es mit einer '1'.

Allerdings, um mehr Licht auf die Frage werfen Sie wurden gebeten, weil C eine kompilierte Sprache bis in den Maschinencode ist werden Sie nie die Reflexion haben und Innerlichkeit Sie mit einer Sprache wie Java oder C #. All die Namensgebung wird nach der Kompilierung verloren, wenn Sie einen Rahmen um den Source / Compiler gebaut haben einige nette Sachen zu tun.

Hope dieses hilft. (Entschuldigen Sie das Wortspiel)

Leider ist dies nicht möglich.

#define Anweisungen sind Anweisungen für den Prä-Prozessor, alle Instanzen von count mit 1 ersetzt. Zur Laufzeit gibt es keinen Speicherplatz mit count verbunden ist, so dass der Aufwand ist offensichtlich sinnlos.

Auch wenn Sie Variablen verwenden, nach der Kompilierung gibt es im Programm verwendet keine Reste der ursprünglichen Bezeichner sein. Dies ist in der Regel nur in dynamischen Sprachen.

Ein Trick in C verwendet wird, mit der # Syntax in Makros die Stringliteral der des Makroparameter zu erhalten.

#define displayInt(val) printf("%s: %d\n",#val,val)
#define displayFloat(val) printf("%s: %d\n",#val,val)
#define displayString(val) printf("%s: %s\n",#val,val)

int main(){
  int foo=123;
  float bar=456.789;
  char thud[]="this is a string";

  displayInt(foo);
  displayFloat(bar);
  displayString(thud);

  return 0;
}

Die Ausgabe in etwa wie folgt aussehen:

foo: 123
bar: 456.789
thud: this is a string

#define count 1 ist eine sehr schlechte Idee, weil es verhindert, dass Sie keine Benennung von Variablen oder Strukturfelder count.

Zum Beispiel:

void copyString(char* dst, const char* src, size_t count) {
   ...
}

Ihr count Makro wird die Variablennamen führen wird mit 1 ersetzt, diese Funktion von der Zusammenstellung zu verhindern:

void copyString(char* dst, const char* src, size_t 1) {
   ...
}

C definiert ist eine Pre-Prozessor-Direktive, keine Variable. Der Pre-Prozessor wird Ihre C-Datei durchlaufen und ersetzen, wo Sie mit Schreib zählen, was Sie es wie definiert haben vor dem Kompilieren. Schauen Sie sich die verschleierten C Wettbewerbsbeiträge für einige besonders erleuchtete Verwendungen von diesem und anderen Pre-Prozessor-Richtlinien.

Der Punkt ist, dass es kein ‚count‘ auf ‚1‘ Wert zu zeigen. Es nur eine einfache / finden ersetzen Operation, die vor geschieht wird der Code auch wirklich zusammengestellt.

Ich werde diese editierbare für jemanden verlassen, der wirklich C wirklich weiß, zu korrigieren.

count ist keine Variable. Es hat keine Lagerung zu ihm und keinen Eintrag in der Symboltabelle zugeordnet. Es ist ein Makro, das durch den Präprozessor, bevor er den Quellcode für den Compiler.

ersetzt wird

Auf dem unwahrscheinlichen Fall, dass Sie nicht ganz die richtige Frage stellen, gibt es eine Möglichkeit, den Namen mit Hilfe von Makros zu erhalten:

#define SHOW(sym) (printf(#sym " = %d\n", sym))
#define count 1

SHOW(count); // prints "count = 1"

Der # Operator wandelt ein Makro-Argument in einen String wörtlich zu nehmen.

#define ist eine Pre-Prozessor-Direktive, als solche nicht eine "Variable"

ist

Was haben Sie es eigentlich nicht um eine Variable, ist es eine Präprozessordirektive. Wenn Sie den Code kompilieren wird der Präprozessor durchlaufen und ersetzen mit 1 in dieser Datei alle instaces des Wortes ‚count‘.

Sie könnten sich fragen, wenn ich weiß, 1 kann ich die zählen Punkte, um es finden? Nein. Da die Beziehung zwischen Variablen Namen und Wert ist keine Bijektion gibt es keinen Weg zurück. Betrachten

int count = 1;
int count2 = 1;

vollkommen legal, aber was sollte 1 Entschlossenheit?

In der Regel nicht.

Als erstes wird ein #define nicht eine Variable, ist es ein Compiler Präprozessormakro.

Durch die Zeit, die Hauptphase des Compilers an die Arbeit hat sich der Name mit dem Wert ersetzt, und der Name „zählen“ wird nicht überall im Code vorhanden sein, die kompiliert wird.

Für Variablen, ist es nicht möglich, zur Laufzeit Variablenname in C-Code, um herauszufinden. Diese Informationen werden nicht gehalten. Im Gegensatz zu Sprachen wie Java oder C #, C ist nicht viel Metadaten hält überhaupt, in compiliert bis auf Assemblersprache.

Richtlinie mit „#“ beginnt von dem Pre-Prozessor behandelt werden, die in der Regel Textersetzung tut, bevor Sie den Code in den ‚realen‘ Compiler übergeben. Als solches ist es keine variable Zählung genannt, es ist, als ob alle „count“ Strings im Code ist auf magische Weise mit dem „1“ String ersetzt.

Also, nein, keine Möglichkeit zu finden, dass "Variable".

Im Falle eines Makro diese vorverarbeitet wird und die resultierende Ausgabe zusammengestellt. So ist es absolut keine Möglichkeit, diesen Namen, um herauszufinden, weil nach der Präprozessor seinen Job finnishes würde die resultierende Datei ‚1‘ anstelle von ‚count‘ überall in der Datei enthält.

So lautet die Antwort nein.

Wenn sie an dem C-Quellcode suchen (die sie in einem Debugger sein werden), dann werden sie so etwas wie

siehe
int i = count;

an diesem Punkt, können sie zurück und suchen Sie die Zeile suchen

#define count 1

Wenn aber alles, was sie haben variable iDontKnowWhat ist, und sie können sehen, es Contans 1, gibt es keine Möglichkeit, diese zurück zu ‚count‘ zu verfolgen.

Warum? Da die #define bei Präprozessor Zeit ausgewertet, die noch vor der Kompilierung geschieht (obwohl fast jeder kann es als die erste Stufe der Zusammenstellung betrachtet werden). Folglich ist der Quellcode ist die einzige Sache, die keine Informationen über ‚count‘ hat, wie zu wissen, dass es überhaupt existiert. Zu der Zeit, der Compiler einen Blick in bekommt, hat jede Bezugnahme auf ‚count‘ durch die Zahl ersetzt worden ‚1‘.

Es ist kein Zeiger, es ist nur ein String / Token-Substitution. Der Präprozessor ersetzt die #defines bevor Sie den Code jemals kompiliert. Die meisten Compiler gehören ein -E oder ähnliches Argument vorkompilierte Code emittieren, so können Sie den Code sehen, was aussieht, nachdem alle #directives verarbeitet werden.

Mehr direkt auf Ihre Frage, gibt es keine Möglichkeit zu sagen, dass ein Token in Code ersetzt wird. Ihr Code kann nicht einmal den Unterschied zwischen sagen (count == 1) und (1 == 1).

Wenn Sie wirklich wollen, dass tun, es möglich sein könnte, Quelldatei Textanalyse unter Verwendung von, sagen wir ein Diff-Tool.

Was meinst du mit "Erkenntnis"?

Die Zeile

#define count 1

definiert eine Symbol "count", die 1-Wert hat.

Der erste Schritt des Übersetzungsvorgangs (die so genannte Vorverarbeitung) wird jedes Vorkommen des Symbols ersetzen rechnen mit 1, so dass, wenn Sie:

if (x > count) ...

wird ersetzt durch:

if (x > 1) ...

Wenn Sie dieses nicht erhalten, können Sie sehen, warum „zu finden count“ bedeutungslos ist.

Die Person, die Frage zu stellen (war es ein Interview Frage?) Versucht hat, können Sie zwischen der Verwendung von #define Konstanten im Vergleich zu Aufzählungen zu differenzieren zu bekommen. Zum Beispiel:

#define ZERO 0
#define ONE 1
#define TWO 2

vs

enum {
  ZERO,
  ONE,
  TWO
};

Bei dem Code:

x = TWO;

Wenn Sie Aufzählungen anstelle der #defines verwenden, werden einige Debugger Lage sein, Ihnen die symbolische Form des Wertes zu zeigen, zwei, statt nur den numerischen Wert von 2.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top