【问题标题】:Concatenating Variable Names in C?在 C 中连接变量名称?
【发布时间】:2009-12-02 00:25:26
【问题描述】:

是否可以在 C 中连接变量名?具体来说,我有一个 struct,其中包含 6 个类似的变量,称为 class1class2class3 等。

我想通过一个 for 循环来为每个变量分配一个值,但是如果不以某种方式将变量名称与 for 循环计数器的值连接起来,我就看不到如何做到这一点。

我还能怎么做?

【问题讨论】:

    标签: c variables names


    【解决方案1】:

    当您发现自己在变量名中添加了整数后缀时,想想我应该使用数组

    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++,则需要为该字段找出一个不同的名称。

    【讨论】:

      【解决方案2】:

      有一些动态语言可以做这种事情——C 不是这些语言中的一种。我同意 Sinan - 数组或 STL 向量是要走的路。

      作为一个思想实验 - 如果你有 100,000 个这些变量会发生什么?你会有 100,000 行代码来初始化它们吗?

      【讨论】:

      【解决方案3】:

      C 预处理器可以concatenate 符号,但您是否考虑过只使用数组?

      【讨论】:

      • 预处理器连接不起作用,因为如果将 class 与循环变量 i 连接起来,您将产生 classi 并且编译器会抱怨不存在这样的符号。
      【解决方案4】:

      您还可以做的是编写哈希映射的实现。 由于哈希映射的键集(类似于变量名)不会随时间变化,因此对于每个哈希映射,您可以保留其键的数组以进行有效迭代。 但这完全是(疯狂的)矫枉过正,尤其是在 C 语言中;)

      在 C 中几乎任何事情都是可能的,它是一门很棒的学习语言 :)

      【讨论】:

        【解决方案5】:

        也许 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;预处理器只是产生更多的字符,与运行时值无关。
        • 你是对的 GMAN,感谢您的评论。哎呀,星期天早上不太清醒。很抱歉发布错误的答案。皮埃尔·布
        猜你喜欢
        • 2015-08-16
        • 1970-01-01
        • 2017-08-22
        • 2015-07-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-16
        • 2017-06-13
        相关资源
        最近更新 更多