【问题标题】:Function prototype vs include header in cpp函数原型与 cpp 中包含标头
【发布时间】:2013-02-08 14:08:10
【问题描述】:

我有做一些工作的功能。

啊.h

void doSomething(int n);

A.cpp

#include "A.h"

void doSomething(int n) {
    /* something */
}   

如果我想在另一个源文件中使用这个功能,最好的选择是什么:

1) 包括 A.h

B.cpp

#include "A.h"

void anotherTask() {
    // ...
    doSomething(5);
    // ...
}

2) 或者使用前向声明(函数原型):

B.cpp

void doSomething(int);

void anotherTask() {
    // ...
    doSomething(5);
    // ...
}

有很多关于尽可能频繁地对类使用前向声明的技巧。那么,函数前向声明的最佳实践是什么?

UPD

好的,这个例子太简单了。

如果头文件 A.h 有一些垃圾(相对于对驱动程序级别一无所知的 B.cpp)怎么办:

啊.h

#include "specific_driver_header.h" /* some lowlevel stuff that B.cpp couldn't know */

#define SPECIFIC_DRIVER_DEFINES 0xF0  /* useless define for B.cpp that uses global namespace */

void doSomething(int n);   /* only significant function for B.cpp */

如果我在 B.cpp 中包含 A.h,那么 B.cpp 将不会独立于驱动程序或类似的东西。 在这种情况下我应该使用变体 (2) 吗?

【问题讨论】:

    标签: c++ forward-declaration function-prototypes


    【解决方案1】:

    尽可能在标题中使用原型。这可以防止意外更改一个位置,而不是另一个位置。

    例如,把函数改成:

    void doSomething(long n);
    

    现在还有两个地方:函数的定义,和b.cpp原型要改变。

    如果你有一个头文件,编译器至少有机会告诉你“这看起来不对”。而不是你在后期得到链接器错误......

    【讨论】:

    • 但它有一个副作用。如果我将函数更改为:
      'void doSomething(char n);'
      并且在 B.cpp 中我调用了 'doSomething(257);' - 它的警告可能不是 IDE 的错误。 (但对用户来说是错误的)
    • 通过错误的声明使程序“无效”如何改善?警告/错误肯定比可能根本不起作用的代码好?
    【解决方案2】:

    仅当函数仅在该文件中使用时,我才使用前向声明。

    如果你想让它对其他单元可用,你使用一个头文件,然后你不要使用前向声明(除非你正在解决一个非常具体的问题,比如循环依赖)。不要同时使用两者。切勿在多个地方作出相同的声明。

    编辑

    类的前向声明与您询问的情况不同:

    Should one use forward declarations instead of includes wherever possible?

    您的更新

    不要这样写你的头文件是简单的答案。头文件应尽可能自包含,并且不包含与“公共”接口无关的任何内容。 (我将 'public' 放在引号中,因为当你声明一个 C++ 类时,protected 和 private 方法必须放在同一个'public' 头文件中。但是你仍然应该避免将不需要的东西放在头文件中在那里。)

    也就是说,如果您对此事别无选择,最好包含相关的头文件而不是复制声明。可维护性通常比编译速度更重要。

    【讨论】:

    • 谢谢,这个链接就是我的意思。这让我很困惑——所有这些问题只涉及类的前向声明,而不是函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-19
    • 2012-12-19
    • 2017-08-18
    • 2023-04-10
    • 2014-01-04
    • 1970-01-01
    • 2012-04-20
    相关资源
    最近更新 更多