函数指针赋值

Som*_*ame 4 c compiler-errors function-pointers

在Visual Studio 2012中的函数指针问题之后,我开始怀疑C中函数指针的某些赋值的合法性.

下面的代码以警告编译,就像我所期望的,因为分配的功能,需要更多的比的函数指针声明描述(参数GCC 4.8):

#include <stdio.h>

int test(int x, int y)
{
    printf("%d", x);
    printf("%d", y);
    return 0;
}

int main()
{
    int (*test_ptr)(int);
    test_ptr = test;
    test_ptr(1);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果更改代码以使分配的功能需要较少的参数(GCC 4.8),则会出现相同的警告.再次,这是预期的.

但是,以下代码在没有单个警告的情况下编译,尽管分配的函数需要2个参数而不是0(GCC 4.8):

#include <stdio.h>

int test(int x, int y)
{
    printf("%d", x);
    printf("%d", y);
    return 0;
}

int main()
{
    int (*test_ptr)();
    test_ptr = test;
    test_ptr();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

任何地方都不会有铸件.

谁能解释这个编译器行为?

NPE*_*NPE 9

下列:

int (*test_ptr)();
Run Code Online (Sandbox Code Playgroud)

采用未指定数量的参数,而不是零参数.

对于后者,写

int (*test_ptr)(void);
Run Code Online (Sandbox Code Playgroud)

PS调用零参数的零参数函数会导致未定义的行为.