我需要声明一个指向函数的指针数组,如下所示:

extern void function1(void);
extern void function2(void);
...

void (*MESSAGE_HANDLERS[])(void) = {
   function1,
   function2,
   ...
};

但是,我希望将数组声明为常量——数组中的数据和指向数据的指针。不幸的是,我不记得在哪里放置 const 关键字。

我假设实际的指针(本例中的 MESSAGE_HANDLERS)已经是常量,因为它被声明为数组。另一方面,如果按所示方式声明数组中的函数指针,难道不能在运行时更改吗?

有帮助吗?

解决方案

有是要记住如何构建这种类型的技术。先试着读他们的名字开始指针和从右至左读。

如何声明的东西,而帮助?

阵列

T t[5];

是5吨的阵列。为了使t的函数类型,你写的返回类型的左侧,与参数正确的:

void t[5](void);

<强>将的5个功能阵列返回void和不采取任何参数。但是功能本身不能在阵列中塞!他们不是对象。只有指向他们可以。

什么
void * t[5](void);

这仍然是错误的,因为它只是改变返回类型是一个指针无效。你必须使用括号:

void (*t[5])(void);

,这将实际工作。 t是5个指针数组给函数返回void和不采取任何参数

大!关于指针数组怎么阿拉斯?这是非常相似的。元素类型出现在左侧,并在合适的尺寸。再次,需要括号因为否则阵列将成为整数的指针的多维数组:

int (*t[5])[3];

这就是它!一个 5个的指针数组3 INT的阵列

什么功能?

我们刚刚得知是有关功能的真实了。让我们声明函数采取这一返回一个指针到另一个功能不采取任何参数和返回void一个int:

void (*f(int))(void);

我们需要再次括号如上他一样的道理。现在,我们可以调用它,并调用返回的功能再次指向。

f(10)();

返回一个指向函数返回另一个函数指针

这个是什么?

f(10)(true)(3.4);

?换句话说,一个的功能将如何采取int的指针返回到函数取布尔返回一个指针的函数采取双和返回void 的将是什么样子?答案是,你只是窝他们:

void (*(*f(int))(bool))(double);

您可以这样做无尽的时间。事实上,还可以返回一个指针数组,就像可以指向一个函数:

int (*(*f(int))(bool))[3];

这是考虑int的指针返回到功能服用布尔的指针返回到3整数的数组

一个功能

它有什么用常量呢?

现在,上面介绍了如何从基本类型建立络合剂的类型,你可以把在地方const,你现在知道他们属于。试想:

T c * c * c ... * c name;

T是,我们最终在端指向基本类型。该c代表无论是const或不常量。例如

int const * const * name;

将声明名称为具有类型指针到恒定指针到恒定INT 。你可以改变name,但你不能改变*name,这将是类型

int const * const

和既不**name,这将是类型的

int const

让我们这适用于上述一个函数指针:

void (* const t[5])(void);

这实际上将声明数组以包含恒定的指针。因此创建(并初始化)阵列之后,在指针是常量,这是因为const星之后出现。需要注意的是,我们不能把const星号之前在这种情况下,由于有没有指针指向常数函数。功能简单地将没有意义不能被const。所以下面的是无效的:

void (const * t[5])(void);

结论

声明函数和阵列实际上的C ++和C的方法实际上是有点混乱。你必须先得到你的头左右,但如果你了解它,你可以用它写得很紧凑函数的声明。

其他提示

cdecl表示:

cdecl> explain void (* const foo[])(void)
declare foo as array of const pointer to function (void) returning void

是不是你需要什么?

在这样的情况下,做一个typedef命名你的函数的签名,这使得它更简单:

typedef void MESSAGE_HANDLER(void);

与在地方,应该只是:

MESSAGE_HANDLER * const handlers[] = { function1, function2 };

要获取数组恒定的实际内容。

修改的:删除了指针部分来自typedef,这真的是更好的(生活和学习)

使用Visual Studio 2008中,我得到:

void (* const MESSAGE_HANDLERS[])(void) = {
   NULL,
   NULL
};

int main ()
{
    /* Gives error 
        '=' : left operand must be l-value
    */
    MESSAGE_HANDLERS = NULL;

    /* Gives error 
        l-value specifies const object
    */
    MESSAGE_HANDLERS[0] = NULL;
}

我不确定这是否适用于“C”。它确实可以在“C++”中工作:

  • 首先将 MESSAGE_HANDLERS 定义为类型:

    typedef void (*MESSAGE_HANDLER)();

  • 然后,使用类型定义将数组声明为常量:

    MESSAGE_HANDLER const handlers[] = {function1, function2};

诀窍在于 typedef, ,如果您可以在“C”中执行相同的语义,那么它也应该可以工作。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top