部分 C 字符串初始化
partial C String initialisation
在我今天阅读的一些代码中,存在一种 C 字符串初始化类型,这对我来说是新的。
它链接多个字符串初始化,如“A”“B”“C”...
它还允许将字符串初始化夹板到多行
我设置了一个小的 Hello World 演示,所以你可以明白我在说什么:
#include <stdio.h>
#define SPACE " "
#define EXCLAMATION_MARK "!"
#define HW "Hello"SPACE"World"EXCLAMATION_MARK
int main()
{
char hw_str[] =
"Hello"
SPACE
"World"
"!";
printf("%s\n",hw_str);
printf("%s\n",HW);
return 0;
}
所以这里有一些问题:
- 这是否符合标准?
- 为什么这有效? “abc”就像一个数组 {'a','b','c'} 对吗?那么为什么数组初始化连接在多对“”上工作?
- 此功能是否有正式名称 - 比如当您在 google 中输入它时,您会找到一些描述它的文档吗?
- 这是便携式的吗?
来自 C 标准(5.1.1.2 翻译阶段)
1 The precedence among the syntax rules of translation is specified by
the following phases.
- Adjacent string literal tokens are concatenated
例如这部分程序
char hw_str[] =
"Hello"
SPACE
"World"
"!";
宏替换后看起来像
char hw_str[] =
"Hello"
" "
"World"
"!";
在第六阶段由预处理器通过连接相邻的字符串文字进行处理,你有
char hw_str[] =
"Hello World!";
在我今天阅读的一些代码中,存在一种 C 字符串初始化类型,这对我来说是新的。
它链接多个字符串初始化,如“A”“B”“C”...
它还允许将字符串初始化夹板到多行
我设置了一个小的 Hello World 演示,所以你可以明白我在说什么:
#include <stdio.h>
#define SPACE " "
#define EXCLAMATION_MARK "!"
#define HW "Hello"SPACE"World"EXCLAMATION_MARK
int main()
{
char hw_str[] =
"Hello"
SPACE
"World"
"!";
printf("%s\n",hw_str);
printf("%s\n",HW);
return 0;
}
所以这里有一些问题:
- 这是否符合标准?
- 为什么这有效? “abc”就像一个数组 {'a','b','c'} 对吗?那么为什么数组初始化连接在多对“”上工作?
- 此功能是否有正式名称 - 比如当您在 google 中输入它时,您会找到一些描述它的文档吗?
- 这是便携式的吗?
来自 C 标准(5.1.1.2 翻译阶段)
1 The precedence among the syntax rules of translation is specified by the following phases.
- Adjacent string literal tokens are concatenated
例如这部分程序
char hw_str[] =
"Hello"
SPACE
"World"
"!";
宏替换后看起来像
char hw_str[] =
"Hello"
" "
"World"
"!";
在第六阶段由预处理器通过连接相邻的字符串文字进行处理,你有
char hw_str[] =
"Hello World!";