4

我有做一些工作的功能。

void doSomething(int n);

A.cpp

#include "A.h"

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

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

1) 包括啊

B.cpp

#include "A.h"

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

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

B.cpp

void doSomething(int);

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

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

UPD

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

如果标题 Ah 有一些垃圾(相对于对驱动程序级别一无所知的 B.cpp)怎么办:

#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 中包含 Ah,那么 B.cpp 将不会独立于驱动程序或类似的东西。在这种情况下我应该使用变体(2)吗?

4

2 回答 2

6

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

例如,将函数更改为:

void doSomething(long n);

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

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

于 2013-02-08T14:13:21.120 回答
5

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

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

编辑

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

是否应该尽可能使用前向声明而不是包含?

你的更新

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

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

于 2013-02-08T14:11:02.793 回答