函数原型vs cpp包含头

时间:2013-02-08 14:08:10

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

我有功能做一些工作。

A.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,对驱动程序级别一无所知)怎么办:

A.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)吗?

2 个答案:

答案 0 :(得分:6)

在可能的情况下,始终在标题中使用原型。这可以防止意外地改变一个地方而不是另一个地方。

例如,将功能更改为:

void doSomething(long n);

现在还有另外两个地方:功能的定义,以及b.cpp原型的改变。

如果你有一个标题,编译器至少有机会告诉你“这看起来不对”。而不是你迟到的链接器错误......

答案 1 :(得分:5)

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

如果要将其提供给其他单位,则使用头文件,然后使用前向声明(除非您正在解决非常具体的问题,例如循环依赖性)。不要同时使用两者。不要在多个地方做同样的声明。

修改

课程的前向声明与您提出的问题不同:

Should one use forward declarations instead of includes wherever possible?

您的更新

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

那就是说,如果你对这个问题别无选择,那么包含相关的头文件比复制声明更好。可维护性通常比编译速度更重要。