Objective c 如何动态地自动注册C函数,使其在整个项目中都可用,而无需任何导入/头文件/外部文件/.pch文件?

Objective c 如何动态地自动注册C函数,使其在整个项目中都可用,而无需任何导入/头文件/外部文件/.pch文件?,objective-c,dynamic,runtime,Objective C,Dynamic,Runtime,在我的项目中,我有一个doSomething.m和sososomething.h文件,只有C函数: void doSomething() { } 第一个问题:我应该怎么做才能使这个函数在代码中的任何位置都可以访问,而不需要导入任何标题 注意:我想解决这个问题根本不需要doSomething.h文件,但它的存在/不存在并不是一个限制 我有以下几点知识,但我不能完全了解需要什么: 我可以使用另一个具有属性((构造函数))的函数,该函数将在编译运行时运行,它可以执行一些操作来注册doSometh

在我的项目中,我有一个doSomething.m和sososomething.h文件,只有C函数:

void doSomething() {

}
第一个问题:我应该怎么做才能使这个函数在代码中的任何位置都可以访问,而不需要导入任何标题

注意:我想解决这个问题根本不需要doSomething.h文件,但它的存在/不存在并不是一个限制

我有以下几点知识,但我不能完全了解需要什么:

  • 我可以使用另一个具有属性((构造函数))的函数,该函数将在编译运行时运行,它可以执行一些操作来注册doSomething
  • _类添加方法添加“运行时”上的方法。但我不知道如何解析“全局名称空间类”
  • NSObject的+加载方法,但与此无关
第一个问题之上的第二个棘手问题:当我对第一个问题有了答案时,我如何才能防止“函数‘doSomething’的隐式声明在C99中无效”只针对函数doSomething而不是所有其他函数

更新:我忘记从考虑中排除以下选项:

  • .pch文件,全局标题
  • 我希望使用doSomething方法的文件不应包含任何附加声明,如extern void doSomething()

  • 在要使用它的文件中,导入它:

    extern void doSomething (void);
    

    在要使用它的文件中,导入它:

    extern void doSomething (void);
    

    好吧,你不能真的这样做,所以你不必导入一个头,但你可以做的是添加包括到您的预编译头

    查看项目中的“支持文件”文件夹

    您将看到这样的文件

    <ProjectName>-prefix.pch
    
    -prefix.pch
    
    将您的导入添加到此文件的底部。然后每个文件都会在这里添加所有导入

    注意

    我使用Xcode


    我想如果您使用另一个IDE,比如GnuStep,您可能会有另一个类似的地方。我不知道另一个IDE是如何工作的。

    你不可能真正做到这一点,因此你不必导入头文件,但是你可以做的是将include添加到预编译头文件中

    查看项目中的“支持文件”文件夹

    您将看到这样的文件

    <ProjectName>-prefix.pch
    
    -prefix.pch
    
    将您的导入添加到此文件的底部。然后每个文件都会在这里添加所有导入

    注意

    我使用Xcode


    我想如果您使用另一个IDE,比如GnuStep,您可能会有另一个类似的地方。我不知道另一个IDE是如何工作的。

    谢谢你的回答,我知道这个选项。请看,我是如何更新我的问题的。听起来你想要一些不可用的东西。要么代码知道该方法,要么它不知道。您需要隐式声明,但不幸的是C99不允许这样做。要么通过外部导入告诉它您有可用的函数,要么导入包含原型的标题。我不知道还有什么别的办法。>听起来你想要的是没有货的东西。我知道我在问一些棘手的问题,但这是我问题的重点。也许你可以把它从C99模式中去掉。在终端中查看
    man gcc
    。并查看-std=部分如果查看目标的构建设置,可以找到并更改
    C语言方言。我不知道这会有什么帮助。谢谢你的回答,我知道这个选择。请看,我是如何更新我的问题的。听起来你想要一些不可用的东西。要么代码知道该方法,要么它不知道。您需要隐式声明,但不幸的是C99不允许这样做。要么通过外部导入告诉它您有可用的函数,要么导入包含原型的标题。我不知道还有什么别的办法。>听起来你想要的是没有货的东西。我知道我在问一些棘手的问题,但这是我问题的重点。也许你可以把它从C99模式中去掉。在终端中查看
    man gcc
    。并查看-std=部分如果查看目标的构建设置,可以找到并更改
    C语言方言。我不知道这会有什么帮助。谢谢你的回答。我想要一个不需要任何额外申报/进口的答案。谢谢你的回答。我想得到一个根本不需要任何额外申报/进口的答案。