【C++】字符串字面量拼接

这是 C/C++ 语言 中特有的 字符串字面量拼接(String Literal Concatenation) 语法。

在 C/C++ 中,如果两个或多个字符串字面量之间只有空白字符(空格、换行、制表符等)而没有其他运算符,编译器会在预处理阶段自动将它们拼接成一个完整的字符串。

为什么要这么写?

  1. 保持代码可读性:GLSL(着色器语言)代码通常包含多行。如果写成一行,代码会非常长,难以阅读和维护。

  2. 保留换行符 :注意每一行末尾的 \n。GLSL 编译器(GPU驱动)需要换行符来正确解析多行代码。如果直接去掉换行,所有的代码挤在一行,虽然有时也能编译,但一旦报错,错误提示的行号就会完全错乱。

  3. 避免使用反斜杠续行 :如果不拼接,你可能会写成这样:

    c 复制代码
    const char *vsrc = "#version 330 core\n\
    layout(location = 0) in vec2 position;\n\
    void main() {\n\
        gl_Position = vec4(position, 0.0, 1.0);\n\
    }\n";

    这种写法虽然能换行,但极其脆弱 。如果 \ 后面不小心多了一个空格,就会导致编译报错。而字符串拼接法完美避开了这个坑。

编译器视角的等价代码

对于编译器来说,你写的这段代码和下面这行代码是完全等价的:

c 复制代码
const char *vsrc = "#version 330 core\nlayout(location = 0) in vec2 position;\nvoid main() {\n    gl_Position = vec4(position, 0.0, 1.0);\n}\n";

💡 补充:现代 C++ 的替代方案

如果你使用的是 C++11 或更高版本,还可以使用 原始字符串字面量(Raw String Literals) ,这样连 \n 都不需要写了,看起来更像真正的 GLSL 代码:

cpp 复制代码
const char *vsrc = R"(
#version 330 core
layout(location = 0) in vec2 position;
void main() {
    gl_Position = vec4(position, 0.0, 1.0);
}
)";

这种 R"(...)" 的写法在 OpenGL/Vulkan 开发中现在也非常流行,因为它不仅可读性极佳,而且不需要手动转义任何字符。


相关推荐
djarmy5 小时前
MAIN.c(1): warning C318: can’t open file ‘STC8G.H’ 报错 解决 分析
c语言·开发语言·mongodb
HEJOO95 小时前
深入理解 Java volatile 关键字:原理、用法与常见误区
java·开发语言·spring
曹牧5 小时前
Java:no content to map due to end of input
java·开发语言
梦梦代码精6 小时前
《回收租赁系统技术选型避坑指南:业务闭环与二开自由度详解》
开发语言·低代码·docker·开源·代码规范
隔窗听雨眠6 小时前
记一次SQL Server数据库性能分析:从CPU100%到单配置修复的完整诊断
开发语言·数据库·php
David猪大卫6 小时前
【C++修炼】智能指针使用及原理
开发语言·c++·经验分享·笔记·学习·考研·面试
charlie1145141916 小时前
现代Qt开发之图像处理进阶:像素操作与格式转换
开发语言·图像处理·qt
李永奉6 小时前
中科蓝讯SDK开发-BT893x 面条耳机连接vivo手机后连接APP端,最后手机端设置页面手动断开蓝牙连接,此时耳机端假断开
c语言·开发语言·嵌入式硬件·物联网·智能手机·电脑
零衣贰6 小时前
The 2026 ICPC Asia East Continent Online Contest (I) 题解
c++·icpc
秦老师Q7 小时前
php零基础入门到实战,从语法到框架,一篇搞定
开发语言·php