动态定义const

时间:2013-12-03 11:43:05

标签: c

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

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


for (ix=0; ix< 2; ix++) {
  #define ix a[ix]
}

所以我希望0foo1bar等。

我希望能够在其他值中分配值,如下所示:

anotherArr[0] ="something";

但此0应为foo。 我正在尝试替换关联数组。 任何线索?

5 个答案:

答案 0 :(得分:4)

没有。 #define在编译时替换该值。你想要一些在运行时的东西,这是行不通的。 #define由预处理器处理,在这种情况下使用类似简单搜索和替换的东西。

答案 1 :(得分:3)

你做不到。 #define ZERO 0基本上会通过你的代码在编译之前将它找到的所有ZERO替换为0。然后代码被编译。

答案 2 :(得分:1)

这是不可能的,因为定义在编译时解决 - 而不是在执行时解析。预处理器只会在之前替换你定义的每一次出现,然后使用你在那里定义的任何东西进行编译。如果一行包含#(或之前只有空格)作为第一个字符,则将其作为指令传递给preprocessor

您希望能够写出像anotherArr["foo"] = "bar";这样的内容吗? 在C ++中,您只需使用std :: map:

std::map<std::string, std::string> map;
map["foo"] = "bar";

但是要在C中解决你的问题,你需要别的东西,因为没有标准的数据结构来做这样的事情。 但你可能在那里使用的是哈希表 - 即http://troydhanson.github.io/uthash/index.html

#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;
}

这里的synatx有点不同 - 但我认为它可以解决你在运行时动态#define试图解决的问题。

答案 3 :(得分:0)

不,#define预处理器构造:不涉及代码或编译器操作。

答案 4 :(得分:0)

要扩展当前答案,我们可以使用gcc -E

查看预处理后的源代码
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++) {

}

在这里你可以看到,在预处理之后,循环现在是空的,这意味着编译器甚至不知道关于你刚刚试图逃脱的#define :)。