Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中查找变量名_C_Constants_C Preprocessor - Fatal编程技术网

在C中查找变量名

在C中查找变量名,c,constants,c-preprocessor,C,Constants,C Preprocessor,昨晚有人用C问了我一个问题,我不知道答案,因为我从大学开始就很少用C,所以我想也许我可以在这里找到答案,而不是忘记它 如果某人有以下定义: #define count 1 此人能否使用变量名中的1找到变量名count 我不这么认为,因为我以为计数会指向1,但不知道1如何指向计数。你说的“查找”是什么意思 线路 #define count 1 定义值为1的符号“计数” 编译过程的第一步(称为预处理)将用1替换每次出现的符号计数,以便: if (x > count) ... 将替换为:

昨晚有人用C问了我一个问题,我不知道答案,因为我从大学开始就很少用C,所以我想也许我可以在这里找到答案,而不是忘记它

如果某人有以下定义:

#define count 1
此人能否使用变量名中的1找到变量名
count

我不这么认为,因为我以为计数会指向1,但不知道1如何指向计数。

你说的“查找”是什么意思

线路

#define count 1
定义值为1的符号“计数”

编译过程的第一步(称为预处理)将用1替换每次出现的符号计数,以便:

if (x > count) ...
将替换为:

if (x > 1) ...

如果你明白了这一点,你就会明白为什么“查找计数”毫无意义。

\define
是一个预处理器指令,因此它不是一个“变量”

C define是一个预处理器指令,而不是一个变量。在编译之前,预处理器将检查您的C文件,并将您写入计数的位置替换为您定义的位置。查看模糊的C竞赛条目,了解此指令和其他预处理器指令的一些特别有启发性的用法

关键是没有“计数”指向“1”值。它只是一个简单的/find-replace操作,甚至在真正编译代码之前发生

我将把它保留为可编辑状态,让真正了解C的人来修改

那个人能用里面的1找到变量名“count”吗


简单的答案是不,他们不能#这样的定义由预处理器处理,它们只指向一个方向。当然,另一个问题是,即使是编译器也不知道——因为“1”可以指向任何东西——多个变量可以同时具有相同的值。

我相信比我更能说会道、更精通的人会指出,定义的东西没有编译到源代码中,您拥有的是一个预处理器宏,它将遍历源代码,并使用“1”更改它找到的“count”的所有实例

然而,为了更清楚地说明你被问到的问题,因为C是一种编译语言,一直到机器代码,你永远不会像Java或C#这样的语言那样进行反思和反思。编译后所有的命名都会丢失,除非您有一个围绕源代码/编译器构建的框架来做一些漂亮的事情


希望这有帮助。(请原谅这句双关语)

这里的实际上不是一个变量,而是一个预处理器指令。当您编译代码时,预处理器将检查并用1替换该文件中单词“count”的所有部分

你可能会问我是否知道1我能找到它的计数点吗?不,因为变量名和值之间的关系不是双射关系,所以没有回头路。考虑

int count = 1;
int count2 = 1;

完全合法,但我应该解决什么问题

基于@Cade Roux的答案,如果使用预处理器#define将值与符号关联,则在预处理器运行后,代码将不会引用符号:

#define COUNT (1)
...
int myVar = COUNT;
...
预处理器运行后:

...
int myVar = (1);
...
正如其他人所指出的,出于上述原因,这基本上意味着“不”

首先,define不是一个变量,它是一个编译器预处理器宏

当编译器的主阶段开始工作时,名称已被值替换,并且名称“count”将不存在于编译的代码中的任何位置

对于变量,在运行时不可能在C代码中找到变量名。这些信息没有保存。与Java或C#等语言不同,C在编译到汇编语言时根本不保留太多元数据。

以“#”开头的指令由预处理器处理,预处理器通常在将代码传递到“真实”编译器之前进行文本替换。因此,没有称为count的变量,这就好像代码中的所有“count”字符串都被神奇地替换为“1”字符串


因此,没有,没有办法找到“变量”。

对于宏,这是预处理的,结果输出是编译的。因此,绝对无法找到该名称,因为在预处理器完成其工作后,生成的文件中的所有位置都将包含“1”而不是“count”


所以答案是否定的。

不幸的是,这是不可能的

#define
语句是预处理器的指令,所有
count
实例都替换为
1
。在运行时,没有与
count
关联的内存位置,因此这项工作显然是徒劳的


即使您使用的是变量,在编译之后,程序中使用的原始标识符也不会有任何残留。这通常只在动态语言中才可能实现。

如果他们正在查看C源代码(它们将在调试器中),那么他们将看到如下内容

int i = count;
在这一点上,他们可以搜索回来,找到线

#define count 1
然而,如果他们所拥有的只是变量iDontKnowWhat,并且他们可以看到它包含1,那么就无法将其追溯到“count”


为什么??因为#define是在预处理器时计算的,甚至在编译之前就发生了(尽管对于几乎所有人来说,它都可以被视为编译的第一阶段)。因此,源代码是唯一拥有“count”相关信息的东西,比如知道它曾经存在过。当编译器查看时,对“count”的每个引用都已替换为数字“1”

它不是指针,只是字符串/令牌替换。在代码编译之前,预处理器将替换所有#定义。大多数编译器都包含一个-E或类似的参数来发出预编译代码,因此您可以在处理完所有#指令后看到代码的样子<
#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;
}
foo: 123
bar: 456.789
thud: this is a string
#define ZERO 0
#define ONE 1
#define TWO 2
enum {
  ZERO,
  ONE,
  TWO
};
x = TWO;
#define SHOW(sym) (printf(#sym " = %d\n", sym))
#define count 1

SHOW(count); // prints "count = 1"
void copyString(char* dst, const char* src, size_t count) {
   ...
}
void copyString(char* dst, const char* src, size_t 1) {
   ...
}