0

假设我有这个

typedef struct qwerty {
    void *f;
} qwerty_t;

我想这样做

static qwerty_t x    = {
    .f = (void *)some_external_function
};

我得到是因为(如果我理解正确的话)我编译时error: initializer element is not constant的方向是未知的。some_external_function

如果这不是对错误的正确解释,请解释是什么。

另外,如何初始化.f该函数的方向?

4

2 回答 2

3

从评论到问题:

  1. 你不显示的声明some_external_function?例如,如果它本身是一个函数指针,而不是一个实际的函数,你就会得到那个错误。— <a href="https://stackoverflow.com/users/15168/jonathan-leffler">乔纳森·莱夫勒

  2. 的确,你是对的。我正是这样做的。—亚历山大

我不确定它是确定的,但是... Mac OS X 10.8.4 上的 GCC 4.8.1 可以接受此代码:

extern int some_external_function(int, int);

typedef struct qwerty {
    void *f;
} qwerty_t;

static qwerty_t x    = {
    .f = (void *)some_external_function
};

int main(void)
{
    int i = 1;
    int j = 2;
    int (*f)(int, int) = (int (*)(int, int))x.f;
    return f(i, j);
}

int some_external_function(int i, int j)
{
    return i + j;
}

当像这样编译'extra fussy'时,你会收到一些警告:

$ gcc -std=c99   -Wall -Wextra -pedantic fp.c -o fp  
fp.c:8:14: warning: ISO C forbids conversion of function pointer to object pointer type [-Wpedantic]
         .f = (void *)some_external_function
              ^
fp.c: In function ‘main’:
fp.c:15:26: warning: ISO C forbids conversion of object pointer to function pointer type [-Wpedantic]
     int (*f)(int, int) = (int (*)(int, int))x.f;
                          ^
$

警告是迂腐准确的——但 POSIX 声明函数指针的大小必须与数据指针的大小相同(而 C 标准允许它们不同)。没有-pedantic,就没有警告。

将代码分成两个文件,一个具有xmain()的定义,另一个具有 的定义some_external_function(),编译和链接不会产生错误,也不会产生新的警告。

于 2013-09-14T00:33:16.713 回答
2

这可能是因为您正在为 x 定义静态关键字。基本上,C 要求您将静态存储与常量表达式或值相关联。即使像下面这样简单的事情也会给你同样的错误:

int main() {
   int y = 10;
   static int z = y;
}
于 2013-09-14T00:29:27.650 回答