【问题标题】:What happens with extra spaces and newlines in C/C++ code?C/C++ 代码中多余的空格和换行符会发生什么?
【发布时间】:2022-01-01 08:51:01
【问题描述】:

有区别吗;

int main(){
return 0;
}

int main(){return 0;}

int main(){
return
0;
}

它们都可能编译为相同的可执行文件。 C/C++ 编译器如何处理多余的空格和换行符,以及换行符的处理方式是否与 C 代码中的空格不同?

另外,标签呢?如果有的话,在代码中使用制表符代替空格有什么意义?

【问题讨论】:

  • "它们都可能编译成同一个可执行文件" ==> "它们全部编译成同一个可执行文件。"空白被忽略,除非代码需要在一行上,或者为了消除歧义,或者它是字符串文字的一部分。制表符是空格。
  • 还值得一提的是,就像空格和新闻行一样,(1) cmets 和 (2) 变量名,也不会将其放入可执行文件中 - 所以请使用 then 并使其可读!
  • 编译器对它们的处理与您阅读它们时的处理方式几乎相同,只是它不会像人们那样被奇怪的布局混淆。

标签: c++ c


【解决方案1】:

任何 1+ 空格符号(空格/换行符/制表符/...)的序列都等价于一个空格。

例外:

  • 空格保留在字符串文字中。它们不能包含换行符,C++ 原始文字 (R"(...)") 除外。这同样适用于#include 中的文件名。
  • 单行 cmets (//) 仅以换行符终止。
  • 预处理器指令(以# 开头)仅以换行符终止。
  • \ 后跟换行符会删除两者,允许多行 // cmets、预处理器指令和字符串文字。

此外,如果左侧和/或右侧有标点符号(字母、数字和_ 除外),则忽略空白符号。例如。 1 + 21+2 相同,但 return a;returna; 不同。

例外:

  • 显然,字符串文字中不会忽略空格。也不在#include 文件名中。

  • 由>1个标点符号组成的运算符不能分开,例如cout < < 1 是非法的。这同样适用于 ///* */ 之类的东西。

  • 标点符号之间可能需要一个空格,以防止它合并为单个运算符。例子:

    • + +a++a 不同。
    • a+++b 等同于a++ +b,但不等同于a+ ++b
    • C++11 之前,连续关闭两个模板参数列表需要一个空格:std::vector<std::vector<int> >
  • 定义类函数宏时,左括号前不允许有空格(添加它会将其变为类对象宏)。例如。 #define A()A() 替换为空,但#define A ()A 替换为()

【讨论】:

    猜你喜欢
    • 2018-02-18
    • 2012-10-08
    • 2022-01-10
    • 1970-01-01
    • 2016-05-19
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多