【发布时间】:2012-04-19 22:36:54
【问题描述】:
首先,类型安全意味着编译器在处理不当时可以立即捕获的任何内容。
现在,我听说函数指针不是类型安全的,但是每当我尝试错误地使用它们时,编译器都会为我报告错误。那么,它的类型如何不安全?
例如这是一个函数原型,它接受一个函数指针
void SortElements(void* MyArray, unsigned int iNumofElems,size_t size, int(*compare_funct)(void* First,void* SecondElem))
我已经定义了几个函数来传递给它:
int MySortAsc(void* First, void* Second);
void MyFunct2();
void MyFunct3(void* First);
代码仅编译用于:
SortElements(MyArray, 10, sizeof(DataType), &MySortAsc); //Compiles
SortElements(MyArray, 10, sizeof(DataType), &MyFunct2); //Fails
知道如何在这里误用函数指针吗?
是不是因为这个:
void (*functionPointer)();
...
int integer = 0xFFFFFFFF;
functionPointer = (void(*)())integer;
functionPointer();
回答: 我看到的是 C++ 中的函数指针是类型安全的。当然,它们可以通过不正确地转换来以不安全的方式使用,但这并不使它们成为被称为不安全类型的理由。 .NET 委托也是强类型的,在我看来两者都是类型安全的。
【问题讨论】:
-
您在哪里看到它被描述为不安全?查看源代码将有助于理解作者的意图。
-
“类型安全”意味着一段代码的正确性仅来自其静态类型,而不依赖于变量的特定值。例如,
printf不是类型安全的,因为它的正确性取决于格式字符串的 值 及其参数类型。 -
为什么说 .NET 委托与普通函数指针相比是类型安全的函数指针?
-
@KerrekSB:这里不是这样。 Printf 是不安全的,因为省略号是不维护类型的全部内容(即调用者和被调用者必须就如何解释类型达成一致。从这个角度来看,函数指针与函数一样安全,即使如果在这种特殊情况下由于其他原因不安全:使用
void*会破坏类型安全。 -
@DavidRodríguez-dribeas 我总是可以在 C++ 中进行强制转换并破坏类型安全,如我在上面的示例中所示,如果我调用 functionPointer() 程序将崩溃。据我所知,在.NET 代表中你不能这样做。从这个意义上说,这是否使函数指针不安全?
标签: c++