是否可以在头文件中声明仅在文件';中指定的未知类型的函数;。c';?

是否可以在头文件中声明仅在文件';中指定的未知类型的函数;。c';?,c,header-files,function-declaration,function-definition,C,Header Files,Function Declaration,Function Definition,如有需要,我可以提供具体的实施细节,但一般问题如下: 是否可以在头文件.h中声明具有未知类型参数的函数,该参数将仅在文件.c中指定 类似c++模板的解决方案将而不是解决我的问题,因为我不希望不同的参数类型可能作为函数的输入,定义只考虑一种情况,我不希望有此选项。我只希望头中的声明忽略参数类型,但只是通知其他文件此函数的存在。这是可行的还是我应该重新考虑我的问题 实现细节:函数在file.c中声明为static,我想删除static,以便通过包含相关的file.h头在其他地方使用它。是的,您可以这

如有需要,我可以提供具体的实施细节,但一般问题如下:

是否可以在头文件.h中声明具有未知类型参数的函数,该参数将仅在文件.c中指定

类似c++模板的解决方案将而不是解决我的问题,因为我不希望不同的参数类型可能作为函数的输入,定义只考虑一种情况,我不希望有此选项。我只希望头中的声明忽略参数类型,但只是通知其他文件此函数的存在。这是可行的还是我应该重新考虑我的问题


实现细节:函数在file.c中声明为static,我想删除static,以便通过包含相关的file.h头在其他地方使用它。

是的,您可以这样做。只需声明没有参数列表的函数

比如说

int my_function();
来自C标准(6.7.6.3函数声明器(包括原型))

3函数声明器中的标识符列表,不属于 该函数的定义应为空

  • …函数声明器中不属于定义一部分的空列表 该功能中,没有关于 提供了参数的数量或类型
  • 考虑到在这种情况下,您将有一些限制,如默认参数


    也许你也应该考虑一个通用的选择作为替代。

    < P>是的,你可以这样做。只需声明没有参数列表的函数

    比如说

    int my_function();
    
    来自C标准(6.7.6.3函数声明器(包括原型))

    3函数声明器中的标识符列表,不属于 该函数的定义应为空

  • …函数声明器中不属于定义一部分的空列表 该功能中,没有关于 提供了参数的数量或类型
  • 考虑到在这种情况下,您将有一些限制,如默认参数


    也可以考虑泛型选择作为替代。

    声明函数原型的唯一原因是让其他代码使用什么参数以及返回什么类型函数。


    因此,您的想法(IMO)没有任何意义

    声明函数原型的唯一原因是让其他代码知道它需要什么参数以及返回类型函数是什么。
    因此,您的想法(IMO)没有任何意义

    您可以使用没有参数的函数:
    int my_函数(); 或带有void*参数的函数定义
    int my_函数(void*p1,void*p2…)


    这是个好主意吗?当然没有。

    您可以使用不带参数的函数:
    static int secp256k1_pubkey_load(const secp256k1_context* ctx, secp256k1_ge* ge,
                                     const secp256k1_pubkey* pubkey)
    
    int my_函数(); 或带有void*参数的函数定义
    int my_函数(void*p1,void*p2…)

    这是个好主意吗?当然没有。

    static int secp256k1_pubkey_load(const secp256k1_context* ctx, secp256k1_ge* ge,
                                     const secp256k1_pubkey* pubkey)
    
    因为您只处理指向结构的指针,所以只需要typedef和不完整的结构定义,这些定义可以从定义它们的.h文件中获取,以便为编译器提供足够的声明上下文。这对于结构的typedef很容易,例如,将这一行放在函数声明上方:

    typedef struct secp256k1_context_struct secp256k1_context;
    
    进行相同的重新声明是安全的,因此无论是否使用完整的标题,都可以正常工作

    另外两种类型问题更大,因为它们是匿名结构的typedef。我认为最好的办法是,如果我们没有真实的声明,就给它一个虚假的声明

    #ifndef SECP256K1_H
    typedef void secp256k1_pubkey;
    #endif
    
    #ifndef SECP256K1_GROUP_H
    typedef void secp256k1_ge;
    #endif
    
    (您可以使用真正的secp256k1_pubkey定义,但是_ge定义取决于字段的不同,我想您首先要避免的是有足够的上下文来选择正确的字段。)

    尽管对库进行了更改,但这还是有点脆弱,如果需要的话,需要在该文件之前包含secp256k1头。(否则会出现编译器错误:在此处的注释中记下您所做的操作,如果将来有人发现此问题,他们将知道如何修复。)

    然后,在您自己的头中有足够的函数定义上下文。请注意,任何不只是从其他地方传递这些结构的调用代码都可能需要完整的结构定义:为什么不将此函数声明放在一个新的.h中,它需要包含完整的头文件,而只有少数特定的位置需要它

    因为您只处理指向结构的指针,所以只需要typedef和不完整的结构定义,这些定义可以从定义它们的.h文件中获取,以便为编译器提供足够的声明上下文。这对于结构的typedef很容易,例如,将这一行放在函数声明上方:

    typedef struct secp256k1_context_struct secp256k1_context;
    
    进行相同的重新声明是安全的,因此无论是否使用完整的标题,都可以正常工作

    另外两种类型问题更大,因为它们是匿名结构的typedef。我认为最好的办法是,如果我们没有真实的声明,就给它一个虚假的声明

    #ifndef SECP256K1_H
    typedef void secp256k1_pubkey;
    #endif
    
    #ifndef SECP256K1_GROUP_H
    typedef void secp256k1_ge;
    #endif
    
    (您可以使用真正的secp256k1_pubkey定义,但是_ge定义取决于字段的不同,我想您首先要避免的是有足够的上下文来选择正确的字段。)

    尽管对库进行了更改,但这还是有点脆弱,如果需要的话,需要在该文件之前包含secp256k1头。(否则会出现编译器错误:请在此处的注释中记下您已完成的操作。)