What is the difference between #import and #include in Objective-C?

前端 未结 10 1388
小蘑菇
小蘑菇 2020-11-22 10:12

What are the differences between #import and #include in Objective-C and are there times where you should use one over the other? Is one deprecated?

I was reading th

相关标签:
10条回答
  • 2020-11-22 11:00
    #include + guard == #import
    

    #include guardWiki - macro guard, header guard or file guard prevents to double include a header by a preprocessor that can slow down a build time

    The next step is

    .pch[About] => @import[About]

    [#import in .h or .m]

    0 讨论(0)
  • 2020-11-22 11:05

    If you are familiar with C++ and macros, then

    #import "Class.h" 
    

    is similar to

    {
    #pragma once
    
    #include "class.h"
    }
    

    which means that your Class will be loaded only once when your app runs.

    0 讨论(0)
  • 2020-11-22 11:05

    In may case I had a global variable in one of my .h files that was causing the problem, and I solved it by adding extern in front of it.

    0 讨论(0)
  • 2020-11-22 11:07

    There seems to be a lot of confusion regarding the preprocessor.

    What the compiler does when it sees a #include that it replaces that line with the contents of the included files, no questions asked.

    So if you have a file a.h with this contents:

    typedef int my_number;
    

    and a file b.c with this content:

    #include "a.h"
    #include "a.h"
    

    the file b.c will be translated by the preprocessor before compilation to

    typedef int my_number;
    typedef int my_number;
    

    which will result in a compiler error, since the type my_number is defined twice. Even though the definition is the same this is not allowed by the C language.

    Since a header often is used in more than one place include guards usually are used in C. This looks like this:

     #ifndef _a_h_included_
     #define _a_h_included_
    
     typedef int my_number;
    
     #endif
    

    The file b.c still would have the whole contents of the header in it twice after being preprocessed. But the second instance would be ignored since the macro _a_h_included_ would already have been defined.

    This works really well, but has two drawbacks. First of all the include guards have to be written, and the macro name has to be different in every header. And secondly the compiler has still to look for the header file and read it as often as it is included.

    Objective-C has the #import preprocessor instruction (it also can be used for C and C++ code with some compilers and options). This does almost the same as #include, but it also notes internally which file has already been included. The #import line is only replaced by the contents of the named file for the first time it is encountered. Every time after that it is just ignored.

    0 讨论(0)
提交回复
热议问题