2013-08-17 103 views
1

我想在Xcode iOS/Objective-C项目中使用单独的C头文件和实现文件。
我想用我的main.m实施的方法,但我得到这些错误:在Xcode中使用C头文件和实现文件iOS项目

enter image description here Full size here

我在main.m文件包含user.h

请注意,目标会员在user.c中为HelloWorld选择。当我取消选择时,错误消失了。但是,当我尝试运行应用程序,我在编译的时候得到这些错误: enter image description here
Full size here

当我实现main.m文件的结构和方法,它编译和运行就好了。但我不明白为什么我不能在一个单独的文件中使用这个特定的代码?

源代码:
user.h

#ifndef HelloWorld_user_h 
#define HelloWorld_user_h 

typedef struct { 
    char *name; 
    int age; 
    char sex; 
} User; //sizeof(User) = 16 bytes 

void CreateAndDisplay(User *usr, char *name, int age, char sex); 

#endif 

user.c的

#include <stdio.h> 
#include <stdlib.h> 

void CreateAndDisplay(User *usr, char *name, int age, char sex) { 
    usr->name = name; 
    usr->age = age; 
    usr->sex = sex; 

    printf("User address -> value:\n"); 
    printf("Name:\t%u\t->\t%s\n", (uint)usr, *&usr->name); 
    printf("Age:\t%u\t->\t%i\n", (uint)&usr->age, *&usr->age); 
    printf("Sex:\t%u\t->\t%c\n\n", (uint)&usr->sex, *&usr->sex); 

    printf("User has a size of %li bytes in memory", sizeof(*usr)); 
} 

的main.m

#import <UIKit/UIKit.h> 

#import "HelloWorldAppDelegate.h" 

#include <stdio.h> 
#include <stdlib.h> 

#include "user.h" 

int main(int argc, char *argv[]) 
{ 
    User user1; 
    CreateAndDisplay(&user1, "John Doe", 24, 'm'); 

    @autoreleasepool { 
     return UIApplicationMain(argc, argv, nil, NSStringFromClass([HelloWorldAppDelegate class])); 
    } 
} 
+1

你[屏幕快照]只是来看(http://puu.sh/44eMG.png),你可能会想尝试'的#include“ 'user.c'中的user.h“'。看一下'user.c'的'#include'文件列表。所有这些都是'#include '所以难怪编译器不知道'User'是什么。 – WhozCraig

+0

@QuantumHive我将你的屏幕截图直接移动到了你的文章中。将来,请将代码置于代码块中,因为这会让您的问题独立出来,并且更容易让其他人自行编译,测试和编辑代码。谢谢! –

+0

对不起,我现在将添加代码。 – QuantumHive

回答

1

这些错误是因为有user.c引用两种类型,但没有在头已经宣布它进口:Useruint(在<sys/types.h>定义)(在user.h定义)。要解决这些错误,里面user.c你应该添加以下包括:

#include "user.h" 
#include <sys/types.h> 
1

尝试在user.c中包含user.h,就像包含stdio.h一样。

+0

嗯,谢谢。我不知道我必须在C实现文件中包含头文件。一个错误消失了:它现在可以识别结构。但是其他三个错误仍然存​​在:_“使用未声明的标识符'uint':你的意思是'int'吗?”_为什么我不能使用** uint **? – QuantumHive

+0

好的解决了剩余的错误。显然** uint **是_typedef_,而不是C的标准类型,因此它无法在_.c_文件中识别它,但可以在_.m_文件中识别它。有关定义,请参见[链接](http://puu.sh/44hm9.png)。我已将** uint **更改为解决错误的_user.c_中的** unsigned int **。 ** unsigned int **是ANSI C语言的标准类型。 – QuantumHive