在include指令中使用尖括号和引号有什么区别?
#包括<文件名>#包括“文件名”
在include指令中使用尖括号和引号有什么区别?
#包括<文件名>#包括“文件名”
当前回答
#include "filename" // User defined header
#include <filename> // Standard library header.
例子:
这里的文件名是Seller.h:
#ifndef SELLER_H // Header guard
#define SELLER_H // Header guard
#include <string>
#include <iostream>
#include <iomanip>
class Seller
{
private:
char name[31];
double sales_total;
public:
Seller();
Seller(char[], double);
char*getName();
#endif
在类实现中(例如,Seller.cpp,以及将使用文件Seller.h的其他文件中),现在应该包含用户定义的头,如下所示:
#include "Seller.h"
其他回答
它确实:
"mypath/myfile" is short for ./mypath/myfile
具有是#include所在文件的目录和/或编译器的当前工作目录,和/或default_include_path
and
<mypath/myfile> is short for <defaultincludepaths>/mypath/myfile
如果./在<default_include_paths>中,则不会有任何区别。
如果mypath/myfile位于另一个include目录中,则行为未定义。
对于#include“”,编译器通常搜索包含该include的文件的文件夹,然后搜索其他文件夹。对于#include<>,编译器不会搜索当前文件的文件夹。
有两种方法可以编写#include语句。它们是:
#include"filename"
#include<filename>
每种形式的含义是
#include"mylib.h"
该命令将查找当前目录中的文件mylib.h以及可能已设置的include搜索路径中提到的指定目录列表。
#include<mylib.h>
此命令将仅在指定的目录列表中查找文件mylib.h。
include搜索路径只是一个目录列表,可以搜索包含的文件。不同的C编译器允许您以不同的方式设置搜索路径。
感谢您的回答,特别是Adam Stelmaszczyk和piCookie,以及aib。
与许多程序员一样,多年来,我一直使用“myApp.hpp”格式作为应用程序特定文件,使用<libHeader.hpp>格式作为库和编译器系统文件(即/I和INCLUDE环境变量中指定的文件)的非正式约定,认为这是标准。
然而,C标准规定搜索顺序是特定于实现的,这会使可移植性变得复杂。更糟糕的是,我们使用了jam,它可以自动找出包含文件的位置。可以为包含文件使用相对路径或绝对路径。即
#include "../../MyProgDir/SourceDir1/someFile.hpp"
旧版本的MSVS需要双反斜杠(\\),但现在不需要了。我不知道什么时候变了。为了与'nix兼容,只需使用正斜杠(Windows将接受这一点)。
如果您真的担心这个问题,请使用“./myHeader.h”作为源代码所在目录中的包含文件(我当前的大型项目中有一些重复的包含文件名--这确实是一个配置管理问题)。
为了方便起见,这里复制了MSDN说明)。
引用的表单预处理器按以下顺序搜索包含文件:在与包含#include语句的文件相同的目录中。在当前打开的include文件的目录中,按以下相反顺序他们被打开了。搜索从父包含文件的目录开始继续向上通过任何祖父母包含文件的目录。沿着每个/I编译器选项指定的路径。沿着INCLUDE环境变量指定的路径。角钢支架形式预处理器按以下顺序搜索包含文件:沿着每个/I编译器选项指定的路径。在命令行上进行编译时,沿着INCLUDE环境变量指定的路径进行编译。
要使用gcc查看系统上的搜索顺序,根据当前配置,可以执行以下命令。您可以在此处找到有关此命令的详细信息
cpp-v/dev/null-o/dev/null
Apple LLVM版本10.0.0(clang-1000.10.44.2)目标:x86_64-apple-darwin18.0.0线程模型:posix InstalledDir:Library/Developer/CommandLineTools/usr/bin“/Library/Developer/CommandLineTools/usr/bin/clag”-cc1-三重x86_64-apple-macsx10.14.0-不推荐使用objc-Weror=已弃用的objc isa用法-E-禁用free-禁用llvm验证器-丢弃值名称-主文件名null-mrelocation model pic-pic level 2-mthread model posix-mdisable fp elim-fno strict return-masm verbose-munwind tables-target cpu penryn-dwarf column info-debugger tuning=lldb-target linker version 409.12-v-resource-dir/库/开发人员/命令行工具/usr/lib/clag/10.0.0-isysroot/库/开发人员/命令行工具/sdk/MacOSX10.14.sdk-我/usr/local/include-fdebug compilation dir/Users/hogstrom-fferror limit 19-fmessage长度80-堆栈保护器1-fblocks-fencode扩展块签名-fbojc runtime=macosx-10.14.0-fmax type align=16-fdiagnostics show option-fcolor diagnostics-传统cpp-o-x c/dev/nullclang-cc1版本10.0.0(clang-1000.10.44.2)默认目标x86_64-apple-darwin18.0.0忽略不存在的目录“/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/usr/local/include”忽略不存在的目录“/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/Libraries/Frameworks”#包括“…”搜索从这里开始:#包括<…>搜索从这里开始:/usr/local/include/库/开发人员/命令行工具/usr/lib/clag/10.0.0/include/库/开发人员/命令行工具/usr/include/库/开发人员/命令行工具/sdk/MacOSX10.14.sdk/usr/include/库/开发人员/命令行工具/SDKs/MacOSX10.14.sdk/System/Library/Frameworks(框架目录)搜索列表结束。