我们如何将包含预定义宏的字符串存储到 C 中的变量中?

How can we store a string containing Pre-Defined Macros into a variable in C?

问题在于;当我试图将一些包含预定义宏的字符串存储到变量中时编译器给我一个错误

#include <stdio.h>

int main()
{
    char string[100] = "This line is appended using C programe and,\nThe data is = %s and time is = %s.\n\n", __DATE__, __TIME__;
    return 0;
}

错误是

yyy.c: In function 'main':
yyy.c:5:111: error: expected identifier or '(' before string constant
     char string[100] = "This line is appended using C programe and,\nThe data is = %s and time is = %s.\n\n", __DATE__, __TIME__;
                                                                                                               ^~~~~~~~

当我尝试使用以下语法时

#include <stdio.h>

int main()
{
    char string[100] = ("This line is appended using C programe and,\nThe data is = %s and time is = %s.\n\n", __DATE__, __TIME__);
    return 0;
}

发生的错误是

yyy.c: In function 'main':
yyy.c:5:24: error: invalid initializer
     char string[100] = ("This line is appended using C programe and,\nThe data is = %s and time is = %s.\n\n", __DATE__, __TIME__);
                        ^

但是当我用打印语句打印同一行时,即

#include <stdio.h>

int main()
{
    printf("This line is appended using C programe and,\nThe data is = %s and time is = %s.\n\n", __DATE__, __TIME__);
    return 0;
}

没有报错,输出为

This line is appended using C programe and,
The data is = Jul  9 2021 and time is = 11:32:06.

使用下面的语法就可以了

char str[] = "This line is appended using C programe and,\nThe data is = "__DATE__
                 " and time is = "__TIME__
                 ".\n\n";

__DATE____TIME__ 宏在编译期间扩展为字符串常量,因此您有效地做的是在单个变量声明中给出三个字符串常量的列表:

char string[100] = "one string", "another string", "yet another one";

这不符合声明的结构。字符串常量是一个变量的初始化器,你不能给一个变量三个初始化器。

您可以在一个声明中声明多个变量,并为每个变量提供一个单独的初始值设定项:

char string1[100] = "one string", string2[30] = "another string", string3[50] = "yet another one";

这就是为什么您的编译器期望在逗号之后有一个标识符(另一个变量的名称)。

但这显然不是你想要的。无论如何,您必须在打印之前将它们连接起来或按顺序打印它们以获得所需的输出。

另一种方法是在语法级别将它们连接起来。 C语言支持这样的常量连接:

"this is"    " a "     "sing"   "le str"    "ing"

表示常数

"this is a single string"

所以,你可以做到

char string[] = "The date is " __DATE__ " and time is " __TIME__ ".\n";

声明和定义一个单个字符串,该字符串由连接五个常量.

产生

请注意,我在声明中省略了数组长度。使用显式初始化程序初始化数组时,会在编译期间自动计算缺失的大小以适应给定的字符串长度。