我可以动态#define常量吗? 我希望得到一些数据,循环遍历这些数据,然后分配常量值。 为了想象我想要的东西,我附上了错误的代码:
const char *a[2];
a[0] = "foo";
a[1] = "bar";
for (ix=0; ix< 2; ix++) {
#define ix a[ix]
}
所以我希望0
为foo
,1
为bar
等。
我希望能够在其他值中分配值,如下所示:
anotherArr[0] ="something";
但此0
应为foo
。
我正在尝试替换关联数组。
任何线索?
答案 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 :)。