C 动态定义常量

C 动态定义常量,c,C,我可以动态定义常量吗? 我希望得到一些数据,循环遍历这些数据,然后分配常量值。 要可视化我想要的东西,我附加了错误代码: const char *a[2]; a[0] = "foo"; a[1] = "bar"; for (ix=0; ix< 2; ix++) { #define ix a[ix] } 但是这个0应该是foo。 我正在尝试替换关联数组。 有什么线索吗?否,定义是一个预处理器构造:不涉及代码或编译器操作。否。定义在编译时替换该值。在运行时需要一些不起作用的东西。de

我可以动态定义常量吗? 我希望得到一些数据,循环遍历这些数据,然后分配常量值。 要可视化我想要的东西,我附加了错误代码:

const char *a[2];
a[0] = "foo";
a[1] = "bar";


for (ix=0; ix< 2; ix++) {
  #define ix a[ix]
}
但是这个0应该是foo。 我正在尝试替换关联数组。
有什么线索吗?

否,定义是一个预处理器构造:不涉及代码或编译器操作。

否。定义在编译时替换该值。在运行时需要一些不起作用的东西。define由预处理器处理,在本例中,预处理器使用简单的搜索和替换。

您不能。定义零0基本上是在编译之前通过代码将它找到的所有零替换为0。然后代码被编译。

这是不可能的,因为定义是在编译时解析的,而不是在执行时解析的。预处理器将只替换define的每一次出现,然后用您在其中定义的内容编译它。如果行在传递给as指令之前包含作为第一个字符的字符或仅包含空格

您希望能够编写类似于另一个arr[foo]=bar的内容;正当 在C++中,您可以只使用STD::map为:

std::map<std::string, std::string> map;
map["foo"] = "bar";
但要解决C语言中的问题,您需要一些其他的东西,因为没有标准的数据结构来做类似的事情。 但是你可能可以使用的是一个哈希表


synatx在这里有点不同,但我认为它可以解决您尝试在运行时使用动态定义来解决的问题。

要扩展当前的答案,我们可以在使用gcc-E进行预处理后查看源代码


在这里,您可以看到,在预处理之后,循环现在为空,这意味着编译器甚至不知道您刚才试图避开的定义:。

这是不可能的,因为定义是在编译时解析的,而不是在执行时解析的。有什么线索吗?也许选择另一种语言?挑剔?如果一行在传递给预处理器之前包含第一个字符或仅包含空格。这是不对的。正在预处理的文件的全部内容都会传递给预处理器。当然,整个文件都会被扫描以替换已定义的预处理器宏。但只有以a开头的行作为指令传递给预处理器。我会改变措辞,谢谢。
std::map<std::string, std::string> map;
map["foo"] = "bar";
#include <string.h>  /* strcpy */
#include <stdlib.h>  /* malloc */
#include <stdio.h>   /* printf */
#include "uthash.h"
struct my_struct {
  char name[10];             /* key (string is WITHIN the structure) */
  int id;
  UT_hash_handle hh;         /* makes this structure hashable */
};
int main(int argc, char *argv[]) {
  const char **n, *names[] = { "joe", "bob", "betty", NULL };
  struct my_struct *s, *tmp, *users = NULL;
  int i=0;
  for (n = names; *n != NULL; n++) {
    s = (struct my_struct*)malloc(sizeof(struct my_struct));
    strncpy(s->name, *n,10);
    s->id = i++;
    HASH_ADD_STR( users, name, s );
  }
  HASH_FIND_STR( users, "betty", s);
  if (s) printf("betty's id is %d\n", s->id);

  /* free the hash table contents */
  HASH_ITER(hh, users, s, tmp) {
    HASH_DEL(users, s);
    free(s);
  }
  return 0;
}
guido@solid:~$ cat a.c
const char *a[2];
a[0] = "foo";
a[1] = "bar";


for (ix=0; ix< 2; ix++) {
#define ix a[ix]
}
guido@solid:~$ gcc -E a.c 
# 1 "a.c"
# 1 "<command-line>"
# 1 "a.c"
const char *a[2];
a[0] = "foo";
a[1] = "bar";


for (ix=0; ix< 2; ix++) {

}