代码之家  ›  专栏  ›  技术社区  ›  Some Name

使用隐式声明隐藏助手函数

  •  1
  • Some Name  · 技术社区  · 7 年前

    按规定 here c隐式声明它不知道的函数。所以我倾向于利用它来隐藏实现细节。我定义了以下头文件:

    #ifndef TEST_H
    #define TEST_H
    
    #define PRINT(msg) \
        do{\
            _print_info_msg(msg);\
            printf(msg);\
        } while(0)
    
    #endif //TEST_H
    

    以及相应的C文件:

    #include "test.h"
    
    void _print_info_msg(const char *str){
        printf("INFO: printing %s\n", str);
    }
    

    编译此代码时,编译器警告 implicit declaration of function ‘_print_info_msg’ [-Wimplicit-function-declaration] .

    我看到的好处是我们不直接公开helper函数( _print_info_msg )给任何包括 test.h 但是我们利用链接器所以 Apple PrimtIn in Fig MSG 提供了实现。

    我不确定这种方法…这有道理吗?对我来说,它看起来有点难看,但这是我能为隐式声明找到的唯一“用例”。

    1 回复  |  直到 7 年前
        1
  •  3
  •   StoryTeller - Unslander Monica    7 年前

    医生:你让自己对虫子敞开心扉,而不是真的隐藏任何东西。

    自c99以来,c没有隐式声明规则,甚至在它不是一个特性之前,我们建议使用它。它禁用对函数参数的静态类型检查,并使我们在多个方面对未定义的行为保持开放状态。

    别用它!编译器警告只是为了不破坏旧的代码基,但它应该是一个错误。事实上 要求编译器提供最严格的一致性模式时出错。

    除此之外,你没有真正隐藏任何东西。宏必须出现在头文件中,因此每个翻译单元都会注意到这个符号。你没有隐瞒这样的事情。更不用说符号必须有外部链接(或者程序也不会链接)。

    所以,只要在宏之后或之前添加一个函数声明,以确保您的代码是正确的,即使是在这个千禧年的编译器编译的时候。

    噢,文件范围内带有前导下划线的标识符被保留给实现(您的工具链)。也就是说,你不能有一个带有前导下划线的文件范围标识符,这样会有鼻部恶魔的危险。更名更佳 _print_info_msg .