c++ - 函数原型(prototype) vs 在 cpp 中包含 header

标签 c++ forward-declaration function-prototypes

我有做一些工作的功能。

啊啊

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) 或使用前向声明(函数原型(prototype)):

B.cpp

void doSomething(int);

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

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

UPD

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

如果 header A.h 有一些垃圾怎么办(相对于 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 中包含 A.h,那么 B.cpp 将不依赖于驱动程序或类似的东西。 在这种情况下我应该使用变体 (2) 吗?

最佳答案

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

例如,将函数更改为:

void doSomething(long n);

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

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

关于c++ - 函数原型(prototype) vs 在 cpp 中包含 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14774361/

相关文章:

c++ - C++中的整数和函数

c - 理解 C 结构

c++ - 为什么模板类型推导在这里失败了?

c++ - 如何使用c++11/14来简化这个实现

Objective-C 前向声明与模型层次结构中的#import

c++ - 为什么这些全局变量具有命名空间范围?

C89 - 使用灵活的字符数组和原型(prototype)初始化结构

delphi - 我需要调用 RtlQueryProcessHeapInformation 的原型(prototype)

c - 头文件和函数,是我的函数、参数还是头原型(prototype)?

c++ - __debugbreak 的可移植等效项