200

Possible Duplicate:
What is the difference between #include <filename> and #include “filename”?

What is the difference between angle bracket < > and double quotes " " while including header files in C++?

I mean which files are supposed to be included using eg: #include <QPushButton> and which files are to be included using eg: #include "MyFile.h"???


  • This is an exact duplicate of stackoverflow.com/questions/21593/…, although the top answer in that one is wrong (it does have to do with the locations the preprocessor searches, but the spec DOES NOT DEFINE THOSE LOCATIONS - current directory is a convention, not a requirement). - Nick Bastin

2 답변


221

It's compiler dependent. That said, in general using " prioritizes headers in the current working directory over system headers. <> usually is used for system headers. From to the specification (Section 6.10.2):

A preprocessing directive of the form

  # include <h-char-sequence> new-line

searches a sequence of implementation-defined places for a header identified uniquely by the specified sequence between the < and > delimiters, and causes the replacement of that directive by the entire contents of the header. How the places are specified or the header identified is implementation-defined.

A preprocessing directive of the form

  # include "q-char-sequence" new-line

causes the replacement of that directive by the entire contents of the source file identified by the specified sequence between the " delimiters. The named source file is searched for in an implementation-defined manner. If this search is not supported, or if the search fails, the directive is reprocessed as if it read

  # include <h-char-sequence> new-line

with the identical contained sequence (including > characters, if any) from the original directive.

So on most compilers, using the "" first checks your local directory, and if it doesn't find a match then moves on to check the system paths. Using <> starts the search with system headers.


  • What do you mean by "current working directory"? AFAIK the quotes give priority to the directory in which the file that is using such a directive lives. - Craig Wright
  • @Craig, yeah you're right. I wrote something different than what I meant - a side effect of the build system I've been working on lately is that the two are always the same. - Carl Norum
  • +1 for quoting the specifications. This make your answer more verifyable. - charmoniumQ
  • That's same concept as in C++. +1 for correct. - Jayprakash Dubey
  • Microsoft implementation does NOT start with system headers when <> used - Peter K

41

When you use angle brackets, the compiler searches for the file in the include path list. When you use double quotes, it first searches the current directory (i.e. the directory where the module being compiled is) and only then it'll search the include path list.

So, by convention, you use the angle brackets for standard includes and the double quotes for everything else. This ensures that in the (not recommended) case in which you have a local header with the same name as a standard header, the right one will be chosen in each case.

Linked


Related

Latest