【问题标题】:What is the meaning of the #define in the objective C?目标C中的#define是什么意思?
【发布时间】:2010-07-30 04:12:55
【问题描述】:

我想问一个关于objective-C 或者可能是C 语言的问题。请问#define下面的代码是什么意思?是否像声明一个变量?

#define kMountainNameString         @"name"
#define kMountainHeightString           @"height"
#define kMountainClimbedDateString      @"climbedDate"

【问题讨论】:

    标签: objective-c c c-preprocessor


    【解决方案1】:

    这是一个简单的文本替换宏。与 C、C++ 中的工作方式相同。

    编译器将“粘贴”kMountainNameString 出现的位置 @“姓名”。从技术上讲,这是通过一种称为预处理器的机制在编译器之前发生的。

    【讨论】:

    • 它是进行替换的预处理器。编译器不会看到任何#defines。
    • 是的,早在(也许直到今天)预处理是由一个单独的独立工具完成的时候。
    • 感谢您的所有回复。我想问这三个元素的数据类型是什么?
    • 您在那里写的那些是 NSString 文字,但 #define 不接受类型或进行输入。将其视为在编译之前在源代码上运行的搜索和替换。 kMountainNameString 会被@"name" 替换,但是预处理器根本不关心类型,也不做任何类型检查。
    • NString-s。请注意,预处理既简单又愚蠢。不鼓励过度使用,尤其是在 C++ 中。预处理器对类型和底层语言语法一无所知。
    【解决方案2】:

    #define 是继承自 C 的预处理器指令,采用以下形式

    #define identifier [value]
    

    通常,它用于告诉预处理器在将代码传递给编译器之前用给定文本替换代码中的所有identifier 实例。标识符也可以在没有值的情况下定义,用作编译器标志,以防止相同变量的多个定义,或在执行期间不会更改的机器细节上分支。例如,要根据处理器的体系结构将不同的代码传递给编译器,您可以执行以下操作:

    #ifdef INTEL86
    //some 32-bit code
    #else
    //some 64-bit code
    #endif
    

    在这些定义中分配值时,将值用括号括起来通常是个好主意,以便将其保留为一个单元,而不管它存在于何种上下文中。

    例如,#define FOO 3 + 7#define FOO (3 + 7) 对以下行的结果有不同的影响,这取决于算术运算的顺序:

    a = 3 * FOO
    

    有关一般预处理器指令的更多详细信息,请参阅this link,或有关更侧重于 Objective C 的信息,请参阅this link

    【讨论】:

      【解决方案3】:

      预处理器将所有出现的 kMountainNameString 替换为 @"name" 在编译开始之前。

      【讨论】:

        【解决方案4】:

        #define 是 c 和 c++ 语言中的预处理器指令。

        用于定义文本的预处理宏。 #define 用于在它所在的整个文件中进行替换。

        #define <macro-name> <replacement-string>
        

        【讨论】:

          猜你喜欢
          • 2011-09-24
          • 2011-07-31
          • 1970-01-01
          • 2014-09-11
          • 1970-01-01
          • 2020-10-02
          • 1970-01-01
          • 1970-01-01
          • 2014-01-31
          相关资源
          最近更新 更多