帖子中没有回答这个问题 #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)”来回答。
答案 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
的预处理器之间存在差异:
#include <iso646.h>
#include <stdbool.h>
'
可用作数字分隔符。 (人们普遍认为这是个坏主意,但委员会不接受任何其他事情。)