如果一个使用前向声明,而不是包括在可能的情况?
不,不应将明确的前向声明视为一般准则。前向声明本质上是复制和粘贴的,或者拼写错误的代码,如果你发现它的错误,需要在任何地方使用前向声明来修复。这可能容易出错。
为避免“向前”声明与其定义之间的不匹配,请将声明放入头文件中,并将该头文件包含在定义声明和使用声明的源文件中。
然而,在这种特殊情况下,只有一个不透明的类是前向声明的,这个前向声明可能可以使用,但一般来说,“尽可能使用前向声明而不是include”,就像这个标题一样线程说,可能是相当危险的。
下面是关于前向声明(无形风险=声明不匹配不是由编译器或连接器检测)“看不见的风险”的一些示例:表示数据可能是不安全的符号
下面的例子说明了这个,例如,数据的两个危险向声明以及函数:
文件AC:
#include <iostream>
char data[128][1024];
extern "C" void function(short truncated, const char* forgotten) {
std::cout << "truncated=" << std::hex << truncated
<< ", forgotten=\"" << forgotten << "\"\n";
}
文件BC:
#include <iostream>
extern char data[1280][1024]; // 1st dimension one decade too large
extern "C" void function(int tooLarge); // Wrong 1st type, omitted 2nd param
int main() {
function(0x1234abcd); // In worst case: - No crash!
std::cout << "accessing data[1270][1023]\n";
return (int) data[1270][1023]; // In best case: - Boom !!!!
}
使用g ++ 4.7.1编译程序:
> g++ -Wall -pedantic -ansi a.c b.c
注:隐形危险,因为G ++没有给出编译器或链接错误/警告
注:省略extern "C"
导致对function()
一个链接错误由于C++名字改编。
运行程序:
> ./a.out
truncated=abcd, forgotten="♀♥♂☺☻"
accessing data[1270][1023]
Segmentation fault
简单的答案,没有。 – Nim 2012-03-28 11:20:36
呃 - 这个问题的答案是顶部还是底部? – Mat 2012-03-28 11:21:42
你真正的问题(底部) - AFAIK没有理由不在这种情况下使用前向声明... – Nim 2012-03-28 11:22:40