【问题标题】:Error in macro expansion宏展开错误
【发布时间】:2015-11-02 12:37:10
【问题描述】:

我一直在尝试理解宏扩展,发现第二个 printf 给出了错误。我期望第二个打印语句生成与第一个相同的输出。我知道有一些函数可以进行字符串连接。我发现很难理解为什么第一个打印语句有效而第二个无效。

#define CAT(str1, str2) str1 str2

void main()
{
    char *string_1 = "s1", *string_2 = "s2";
    printf(CAT("s1", "s2"));
    printf(CAT(string_1, string_2));
}

【问题讨论】:

标签: c c-preprocessor


【解决方案1】:

连接字符串文字,如@9​​87654322@,是语言规范的一部分。只是将两个变量并排放置,例如 string_1 string_2语言的一部分。

如果您想连接两个字符串变量,请考虑改用strcat,但请记住为目标字符串分配足够的空间。

【讨论】:

    【解决方案2】:

    尝试“手动”进行预处理:

    CAT 应该接受 2 个输入变量,并一个接一个地打印它们,中间有一个空格。所以...如果我们预处理你的代码,它会变成:

    void main()
    {
        char *string_1 = "s1", *string_2 = "s2";
        printf("s1" "s2");
        printf(string_1 string_2);
    }
    

    虽然"s1" "s2"编译器 自动连接到"s1s2",但string_1 string_2 的语法无效。

    【讨论】:

    • 我认为它与第一个语句相同,因为 string_1 中的值是“s1”,而 string_2 是“s2”
    • 预处理器所做的只是对源代码本身进行操作,一旦完成,代码就会进行正常编译,并且必须为此目的有效。正如我所解释的,string_1 string_2 无效,无法编译。
    • @Pete string_1 是一个准确的变量,"s1" 是一个字符串文字。两者的处理方式不同。
    • @Pete string_1 的值是“s1”。它是一个指向以零结尾的字符串“s1”的指针。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-12
    • 2016-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多