以下のように、他の変数を介して変数値にアクセスすることは可能ですか
char var[30];
char buffer[30];
strcpy(buffer, "ABC");
/*variable var is holding the "buffer" variable name as string*/
strcpy(var,"buffer")
変数varを介して、バッファ変数値「ABC」にアクセスする方法はありますか? ?
以下のように、他の変数を介して変数値にアクセスすることは可能ですか
char var[30];
char buffer[30];
strcpy(buffer, "ABC");
/*variable var is holding the "buffer" variable name as string*/
strcpy(var,"buffer")
変数varを介して、バッファ変数値「ABC」にアクセスする方法はありますか? ?
Cでは実用的な方法ではなく、とにかくそうしたくありません。プログラム ロジックを変数の名前に結び付けるのは、恐ろしい考えです。通常、私は、本当に必要なものがある種のコレクション型 (および配列、マップなど) であるときに、これを試みる人を目にします。
あなたがこれで解決しようとしている問題について私たちに記入してください。
あなたのコメントごと:
動的なデバッグ メッセージが必要です。印刷したい各関数変数を含むファイルがあります。
マクロで文字列化を使用します。
#define str(s) #s
int main() {
int bar;
str(bar) /* replaced by "bar" */
}
いいえ、できません。間接アクセスが必要な場合は、ポインターを宣言して割り当てvar
ます。
char *forVar = var;
// Now you can access/modify via [] operator.
重要な定型コードがないわけではありません。変数名はコンパイル時に削除されます。
理論的には、変数名から変数へのポインターへのマップを格納できます。
それで、基本的に、関数への書き込み/読み取り/関数への受け渡しなどのときに、いくつかの変数をログに記録したいですか?
コンパイルされたCでこれを行うことは、特に実行可能ファイル(compileステートメントで-0n)を最適化する場合は困難です。この場合、一部の変数が完全に消えたり、他の変数によって再利用されたりする可能性があります。
GDBの使用
そうは言っても、gdbは変数アクセスなどをログに記録できることを私は知っています。Pythonスクリプト(http://sourceware.org/gdb/onlinedocs/gdb/Python.htmlを参照)を作成する場合は、変数の内容をログに記録するスクリプトを作成できるはずです。
詳細については、この質問を参照してください:gdbで特定のブレークポイントがヒットしたときに特定のアクションを実行する
オンデマンドのみ、プリコンパイラスクリプトを使用
または、オンデマンドで実行したい場合は、前処理スクリプトを使用して、csvファイルを入力として使用してカスタムマクロなどを追加することをお勧めします。
for each line in CSV:
read variable_name, file_name, variable_type
find all occurrences of variable_name in file_name
for each occurrence
insert printf(....)
オンデマンドのみ、マクロを使用
幸運を。通常、何らかのルックアップが必要であり、印刷関数に変数を選択的に出力する方法が必要になるため、これを行うための適切な方法はありません。場合によっては、次のようなことができます。
static char _LOGGED_VAR_001 = 'z';
static char _LOGGED_VAR_002 = 'z';
#define cMyVar _LOGGED_VAR_001
#define LOG_ALL_VARS() printf("Vals: %c, %c", _LOGGED_VAR_001, _LOGGED_VAR_002)
void myFunc()
{
char cMyVar; // Gets macro'd to _LOGGED_VAR_001 with LOCAL scope
cMyVar = 'a'; // LOCAL scope _LOGGED_VAR_001 becomes 'a'
LOG_ALL_VARS(); // At this point you print out the LOCAL _LOGGED_VAR_001
// and the global _LOGGED_VAR_002
}
あなたは得るだろうVals: a, z
これはかなり醜く、ローカルスコープの変数に対してのみ機能し、メモリ消費を混乱させ、エラーが発生しやすく、一般的には悪い考えです。
オンデマンド、ヒープ/スタックダンプ
十分なストレージがある場合は、オンデマンドですべてのメモリをファイルにダンプできます。それがどのように行われたかにもよるが、これはおそらくあまり移植性がないだろう。しかし、信頼できる方法でそれを行う方法はわかりません。
おすすめ
設計時の診断にはGDBを使用します。それはそれが設計されているものです:)
たとえば、リリースされたコード(自動化されたバグレポート)の分析には、完全なダンプとその後の分析が適切な場合があります。
ユニオンを使ってみることができます
例えば:
union example {
char var[40];
char buffer[40];
} e1;
strcpy(e1.var, "ABC");
printf("%s is same as %s", e1.var, e1.buffer);