我刚刚开始学习目标C,我真的很困惑.h和.m文件是如何相互作用的.这个简单的程序有3个文件:
Fraction.h
#import <Foundation/NSObject.h>
@interface Fraction : NSObject {
int numerator;
int denominator;
}
- (void) print;
- (void) setNumerator: (int) n;
- (void) setDenominator: (int) d;
- (int) numerator;
- (int) denominator;
@end
Run Code Online (Sandbox Code Playgroud)
Fraction.m
#import "Fraction.h"
#import <stdio.h>
@implementation Fraction
-(void) print { printf( "%i/%i", numerator, denominator ); }
-(void) setNumerator: (int) n { numerator = n; }
-(void) setDenominator: (int) d { denominator = d; }
-(int) denominator { return denominator; }
-(int) numerator { return numerator; }
@end
Run Code Online (Sandbox Code Playgroud)
的main.m
#import <stdio.h>
#import "Fraction.h"
int main(int argc, char *argv[]) {
Fraction *frac = [[Fraction alloc] init];
[frac setNumerator: 1];
[frac setDenominator: 3];
printf( "The fraction is: " );
[frac print];
printf( "\n" );
[frac release];
return 0;
}
Run Code Online (Sandbox Code Playgroud)
据我所知,该程序最初开始运行main.m文件.我理解基本的C概念,但这整个"类"和"实例"的东西真的很混乱.在Fraction.h文件中,@interface将分子和分母定义为整数,但是下面用(void)做了什么呢?以下重新定义的目的是什么?我也对Fraction.m的(void)和(int)部分发生了什么以及如何在main.m文件中汇总所有这些内容感到困惑.我想我想说的是,这似乎是一个相当容易的程序来了解不同部分如何相互协作 - 任何人都可以用非技术术语解释一下吗?
Chr*_*cke 63
来自其他环境的人似乎总是相信C和Objective-C编程中使用的.c,.m和.h文件会发生复杂的事情.
实际上,非常非常简单.
为了建立项目集成开发环境 - 比如XCode - 忽略所有.h文件.他们所做的是获取每个.c和.m文件并进行编译.如果程序员(那是你)使用了任何#include或#import指令,编译器会在指令所在的位置插入包含/导入的.h文件的整个文本.
所以,如果你有一个.h文件 - insert.h - 说:
in
Run Code Online (Sandbox Code Playgroud)
一个.c文件说:
Alice
#include "insert.h"
Wonderland
Run Code Online (Sandbox Code Playgroud)
在处理完#includeimport指令后,编译器会看到:
Alice
in
Wonderland
Run Code Online (Sandbox Code Playgroud)
这是非常简单的文件合并行为,我们用来制作复杂的程序:)
.h非常简单的一种约定,通过这种约定,程序员可以使用#include或#import告诉对方文件适合合并 - 可能多次合并.
.c和.m文件不会像这样合并.每个.c和.m文件单独编译 - 生成.o文件.每个.o文件都是已编译函数的集合.然后合并.o文件 - 或"链接" - 以生成最终程序.链接步骤确保每个函数只存在一次,并且所有被调用的函数实际上都存在于某处.
C&Objctive-C定义了一个必须存在于某处的特殊函数 - main()
.同样,语言非常宽松 - 它不关心main()
函数所在的.c或.m文件.仅仅是它存在于某个文件中.
归档时间: |
|
查看次数: |
33094 次 |
最近记录: |