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

时间:2016-03-29 17:22:58

标签: c++ c c-preprocessor

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

在C:

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

在C ++中

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

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

3 个答案:

答案 0 :(得分:9)

  

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

#include预处理程序指令由CPP预处理程序处理,对于C和C ++编译(大多数情况下)是相同的。不同的C和C ++标准可能会引入subtle differences,但这些都不会影响如何处理#include指令有关如何将文件的内容替换为翻译单元(除了头文件的方式)名称已展开并匹配,请参阅@T.C.&#39; s answer)。

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

  

我认为这个问题非常简单,您可以通过说&#34; No&#34;来回答它。或者&#34;是的,这里有区别:1),2)&#34;。

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

那么,从结果来看,C编译器可能无法正确编译从C ++头文件扩展的代码,反之亦然。反过来说。

答案 1 :(得分:9)

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

  

实现应为序列提供唯一的映射   由一个或多个 nondigit 数字(2.10)组成,后跟一个   句点(.)和单个非数字。第一个字符不得   一个数字。实现可能会忽略字母的区别   情况下。

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

  

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

符合要求的C实施可以映射&#34; foobarbaz.h&#34;和&#34; foobarbat.h&#34;到同一个源文件。符合C ++的实现不能。

此外,在C(N1570 6.4.7)中:

  

如果序列中出现'\"///*字符   在<>分隔符之间,行为未定义。   同样,如果字符'\///*出现在   "分隔符之间的序列,行为未定义

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

  

字符'\或其中任何一个字符的外观    q-char-sequence 中的字符序列/*//或    h-char-sequence 有条件地支持实现定义的语义,因为它的外观    h-char-sequence 中的字符"

&#34;有条件地支持实现定义的语义&#34;意味着

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

while&#34;未定义的行为&#34;意味着实现可以做任何想做的事情。

答案 2 :(得分:1)

在C ++中,通常会搜索更多目录。不过,这在技术上并不是指令的区别。

例如,在我的系统上:

 % gcc -E -v -x c - <<< '' 2>&1 | sed -n '/cc1/,/End of search list/p'
 /usr/lib/gcc/x86_64-linux-gnu/5/cc1 -E -quiet -v -imultiarch x86_64-linux-gnu - -mtune=generic -march=x86-64
ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu"
ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/5/../../../../x86_64-linux-gnu/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/lib/gcc/x86_64-linux-gnu/5/include
 /usr/local/include
 /usr/lib/gcc/x86_64-linux-gnu/5/include-fixed
 /usr/include/x86_64-linux-gnu
 /usr/include
End of search list.
% gcc -E -v -x c++ - <<< '' 2>&1 | sed -n '/cc1/,/End of search list/p'
 /usr/lib/gcc/x86_64-linux-gnu/5/cc1plus -E -quiet -v -imultiarch x86_64-linux-gnu -D_GNU_SOURCE - -mtune=generic -march=x86-64
ignoring duplicate directory "/usr/include/x86_64-linux-gnu/c++/5"
ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu"
ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/5/../../../../x86_64-linux-gnu/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/include/c++/5
 /usr/include/x86_64-linux-gnu/c++/5
 /usr/include/c++/5/backward
 /usr/lib/gcc/x86_64-linux-gnu/5/include
 /usr/local/include
 /usr/lib/gcc/x86_64-linux-gnu/5/include-fixed
 /usr/include/x86_64-linux-gnu
 /usr/include
End of search list.

此外,涉及#include的预处理器之间存在差异:

  • 命名运算符是用C ++构建的。在C中,您必须#include <iso646.h>
  • 布尔关键字是用C ++构建的。在C中,您必须#include <stdbool.h>
  • 从C ++ 14开始,'可用作数字分隔符。 (人们普遍认为这是个坏主意,但委员会不接受任何其他事情。)