C的指令#include和C++的指令有什么区别吗?

Die*_*ana 3 c c++ c-preprocessor

没有这个问题在帖子中没有回答之间的区别是什么?#include <filename>#include “filename” 这是一个不同的问题.我正在研究C和C++之间的差异.我通过比较你可以对每种语言制作的最基本的程序来做到这一点:

在C:

#include <stdio.h>
int main()
{
    printf("Hello World"); 
    return 0; 
}
Run Code Online (Sandbox Code Playgroud)

在C++中

#include <iostream>
int main()
{
  std::cout << "Hello World!!!" << std::endl;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我知道标题和编译过程.但我想知道C和C++的#include指令之间是否有任何区别.例如,可能以不同的方式复制复制时的标题内容.我认为这个问题非常简单,您可以通过说"不"或"是,这是差异:1),2)"来回答.

πάν*_*ῥεῖ 9

例如,可能以不同的方式复制复制时的标题内容.

所述#include预处理指令是由CPP预处理器处理,即(大部分)相同为C和C++编译.分散的C和C++标准可能会引入细微差别,但这些都不会影响如何#include处理关于如何将文件内容替换为翻译单元的指令(除了如何扩展和匹配头文件名,请参阅@TC答案).

CPP只是文本替换,只是将从包含文件中看到的内容扩展到翻译单元,无论是C还是C++代码.

我认为这个问题非常简单,您可以通过说"不"或"是,这是差异:1),2)"来回答.

不,该#include指令在文本替换方面没有差异.


好吧,从结果来看,C编译器可能无法正确编译从C++头文件扩展的代码,有时反之亦然.


T.C*_*.C. 9

是的,至少有两个不同之处.在C++中(WG21 N4567 [cpp.include]/5):

实现应为由一个或多个数字数字 s(2.10)组成的序列提供唯一映射,后跟一个句点(.)和一个非数字.第一个字符不应是数字.实现可能会忽略字母大小写的区别.

在C(WG14 N1570 6.10.2/5,强调我的):

实现应为由一个或多个非数字或数字(6.4.2.1)组成的序列提供唯一映射,后跟一个句点(.)和一个非数字.第一个字符不应是数字.实现可以忽略字母大小写的区别,并在该句点之前将映射限制为八个重要字符.

符合要求的C实现可以将" foobarbaz.h"和" foobarbat.h" 映射到同一源文件.符合C++的实现不能.


另外,在C(N1570 6.4.7)中:

如果字符',\,",//,或/*发生之间的序列中<>分隔符,该行为是未定义.类似地,如果字符',\,//,或/*发生之间的序列中"的分隔符,该行为是未定义.

而在C++中(N4567 [lex.header]/2):

的任一字符的外形'\或的任一字符序列/*//Q-炭序列H-炭序列有条件地支持与实现定义的语义,由于是角色的出现"ħ -char-序列.

"有条件地支持实现定义的语义"意味着

  • 如果实施不支持,则必须发布诊断;
  • 如果实现确实支持它,则必须记录其对此构造的解释.

而"未定义的行为"意味着实现可以做任何想做的事情.