【发布时间】:2009-12-02 00:25:26
【问题描述】:
是否可以在 C 中连接变量名?具体来说,我有一个 struct,其中包含 6 个类似的变量,称为 class1、class2、class3 等。
我想通过一个 for 循环来为每个变量分配一个值,但是如果不以某种方式将变量名称与 for 循环计数器的值连接起来,我就看不到如何做到这一点。
我还能怎么做?
【问题讨论】:
是否可以在 C 中连接变量名?具体来说,我有一个 struct,其中包含 6 个类似的变量,称为 class1、class2、class3 等。
我想通过一个 for 循环来为每个变量分配一个值,但是如果不以某种方式将变量名称与 for 循环计数器的值连接起来,我就看不到如何做到这一点。
我还能怎么做?
【问题讨论】:
当您发现自己在变量名中添加了整数后缀时,想想我应该使用数组。
struct mystruct {
int class[6];
};
int main(void) {
struct mystruct s;
int i;
for (i = 0; i < 6; ++i) {
s.class[i] = 1000 + i;
}
return 0;
}
注意:由于class,C++ 编译器会对此感到厌烦。如果您打算将此代码编译为 C++,则需要为该字段找出一个不同的名称。
【讨论】:
有一些动态语言可以做这种事情——C 不是这些语言中的一种。我同意 Sinan - 数组或 STL 向量是要走的路。
作为一个思想实验 - 如果你有 100,000 个这些变量会发生什么?你会有 100,000 行代码来初始化它们吗?
【讨论】:
C 预处理器可以concatenate 符号,但您是否考虑过只使用数组?
【讨论】:
class 与循环变量 i 连接起来,您将产生 classi 并且编译器会抱怨不存在这样的符号。
您还可以做的是编写哈希映射的实现。 由于哈希映射的键集(类似于变量名)不会随时间变化,因此对于每个哈希映射,您可以保留其键的数组以进行有效迭代。 但这完全是(疯狂的)矫枉过正,尤其是在 C 语言中;)
在 C 中几乎任何事情都是可能的,它是一门很棒的学习语言 :)
【讨论】:
也许 CERT-C 安全编码规则 PRE05-C“在连接标记或执行字符串化时理解宏替换”可以帮助您。 有关详细信息,请查看此链接: https://www.securecoding.cert.org/confluence/display/seccode/PRE05-C.+Understand+macro+replacement+when+concatenating+tokens+or+performing+stringification.
简而言之,首先定义一个宏 JOIN_AGAIN(x,y) (x##y) 然后 JOIN(x,y) JOIN_AGAIN(x,y) JOIN_AGAIN 宏允许扩展将连接到 var 名称的循环计数器的值。
干杯 皮埃尔·布伊
【讨论】:
classi;预处理器只是产生更多的字符,与运行时值无关。