C如何在其他变量中引用变量

时间:2018-06-20 17:35:54

标签: c

我对C语言还很陌生,还无法弄清楚如何在其他变量中引用变量。

int main () {

    const char *TOKEN;
    char *cmd;

    TOKEN = "some auth token";
    cmd = "some_cmd --auth-token=%s", TOKEN;
    printf(cmd)
}

这显然行不通。如何将TOKEN的值分配给另一个变量cmd

2 个答案:

答案 0 :(得分:0)

  

如何将TOKEN的值分配给另一个变量cmd

只要TOKENcmd的类型允许,就可以通过分配运算符=将前者的值分配给后者。在您的代码中,这些变量的类型 do 允许这样做,但是您似乎实际上想做的事情有所不同。

您似乎希望这样的语句序列...

TOKEN = "some auth token";
cmd = "some_cmd --auth-token=%s", TOKEN;
printf(cmd);

(添加缺少分号)将具有与此相同的效果...

TOKEN = "some auth token";
printf("some_cmd --auth-token=%s", TOKEN);

...,但是C不能那样工作。变量具有值。值可以是复合值,包括其他值,但不能包含变量

更一般地,变量不能包含C代码(旨在解释为在变量名称出现的地方这样解释)。但是,C预处理器确实具有用于此目的的 macro 工具。宏不是变量,特别是它们在已编译程序中没有单独的表示形式。它们的全部效果是在编译时实现的。但这正是代表C代码的东西所需要的。

那么,就您而言,您可以这样做:

#define COMMAND_WITH_TOKEN "some_cmd --auth-token=%s", token

int main () {
    const char *token;

    token = "some auth token";
    printf(COMMAND_WITH_TOKEN);
}

其含义与以下内容完全相同:

int main () {
    const char *token;

    token = "some auth token";
    printf("some_cmd --auth-token=%s", token);
}

答案 1 :(得分:0)

当心,C源文件中有两种指令。在实际编译之前执行的宏或其他预处理程序指令以及在该预处理之后编译的真实C表达式。

C是一种相当底层的语言,因此变量具有一种类型,并且只能包含该类型的值:此处cmd是指向char的指针,并且只能包含...指向char的指针(唯一的魔术就是标准库的许多函数将以null结尾的char数组解释为字符串。

所以在这一行:

cmd = "some_cmd --auth-token=%s", TOKEN;

编译器会看到一些变量(cmdTOKEN),字符串("some_cmd --auth-token=%s"),赋值运算符(=)和逗号运算符({{1 }})。首先,对逗号运算符的参数求值:,衰减为指向其第一个字符的指针,对"some_cmd --auth-token=%s"求值为其值(它只是一个指针),然后执行逗号运算符并取值表达式的值成为逗号右边成员的值,此处为TOKEN。最后,执行分配TOKEN。因此它可以正常工作,但是可以满足您的要求,但这可能不是您想要的,因为在下一行中,您尝试打印未初始化的char指针...

您必须采取以下可能的方式:

  1. 宏:

    cmd = TOKEN;

    预处理将其更改为:

    int main () {
    
        const char *TOKEN;
    
        TOKEN = "some auth token";
    #define CMD "some_cmd --auth-token=%s", TOKEN
        printf(CMD);
    }
    

    这将给出预期的结果

  2. sprintf函数:

    int main () {
    
        const char *TOKEN;
    
        TOKEN = "some auth token";
        printf("some_cmd --auth-token=%s", TOKEN);
    }