指向功能的指针很奇怪

时间:2015-12-30 12:21:23

标签: c function pointers typedef

我正在尝试使用带有指向函数的指针的typedef,并且它表现得非常奇怪。

以下代码有效:

#include <stdio.h>
#include <stdlib.h>
int funct(int num)
{
    return 0;
}
typedef int(*func)(int num);
int main()
{
    if (1) { return 0; }
    func c = &funct;
    return 0;
}

但是以下代码(没有{})不会:

#include <stdio.h>
#include <stdlib.h>
int funct(int num)
{
    return 0;
}
typedef int(*func)(int num);
int main()
{
    if (1) return 0; 
    func c = &funct;
    return 0;
}

它告诉我这是非法使用该功能。 为什么?它的代码基本相同吗?

编辑: 错误 -

Warning 4   warning C4047: '=' : 'int' differs in levels of indirection from 'int (__cdecl *)(int)' 
Error   1   error C2275: 'func' : illegal use of this type as an expression 
Error   2   error C2146: syntax error : missing ';' before identifier 'c'   
Error   3   error C2065: 'c' : undeclared identifier    

编辑2:我插入了完整的代码。 在第一个例子中,我在构建代码后没有收到任何错误。 在第二段代码中,我得到了上面提到的所有错误。

编辑3:我创建了一个新文件并尝试了代码并且它可以正常工作。我仍然不知道是什么原因引起了错误,所以如果有人能给我一个很棒的想法。

1 个答案:

答案 0 :(得分:4)

错误消息是一个很大的提示。他们看起来很像MSVC ++错误号,不是吗?您是否偶然使用C ++编译器编译C代码?我现在就饶了你的讲座。请使用C编译器编译C代码。如果需要在C ++项目中使用该C代码,则可以在编译C ++代码时使用链接器链接编译后的C模块,类似于Microsoft建议在您希望时链接ws2_32.lib的方式使用winsock。

我知道MSVC ++有一个“编译为C”的选项,但是Microsoft的C编译器真的已经过时了;它只支持C89,这意味着you can't mix declarations with code,至少在VS2013之前。

在适合您的问题的VS2013 there is a bug中。如果您正在使用此IDE,我建议升级(仅稍微)以修复该错误...请注意,MSVC ++ 2013 仍然不完全支持C99 :(所以也许是时候到{{ 3}}