【问题标题】:error C2099: initializer is not a constant错误 C2099:初始化程序不是常量
【发布时间】:2013-09-11 13:58:14
【问题描述】:

协议.h

typedef struct sDevice_d
{
    char name[24];
    signed int (*Send)(unsigned char*, unsigned short);
    signed int (*Recv)(unsigned char*, unsigned short);
} sDevice_d, *psDevice_d;

设备.c

#include "Protocol.h"

sDevice_d sDevice = { "ten", I2c_Send };
psDevice_d psDevice = &sDevice;

static signed int I2c_Send(unsigned char* buf, unsigned short len)
{
    return 0;
}

在上面的代码中,我收到以下错误:

错误 C2099:初始化器不是常量

请帮我解决这个问题。

我正在使用 Visual Studio Win32 应用程序。

【问题讨论】:

  • I2c_Send 原型在结构初始化之前可用吗?
  • @NemanjaBoric 你确定吗?结构 typedef 不完整。
  • 需要在sDevice初始化之前为I2c_Send添加原型。
  • 到目前为止发布的所谓“欺骗”都与这个问题没有任何关系。上面发布的代码是正确的,所有初始化程序实际上都是常量(特别是地址常量)。它并没有真正在 VS 中产生“初始化程序不是常量”错误。显然,代码不准确和/或不相关。
  • @SHRI - 为了清楚起见,建议使用原型,但不是严格要求。但是函数定义的可见性,然后才能在任何地方使用。例如,在您的代码中,如果函数本身从 .c 中删除,并放入 .h(替换原型),它将编译和构建。因此,在您的情况下,可见性是限制问题。在大多数编译器中,有些设置允许您省略原型。不过不推荐。查看 here 以了解有关原型的良好讨论。

标签: c visual-studio-2010


【解决方案1】:

函数 I2c_Send 需要定义并且可见 在尝试使用创建和初始化结构之前 它在其初始化列表中。我已经包含了对您的代码的改编 下面在两个文件中说明了这一点:

protocol.h

typedef struct
{
    char name[24];
    signed int (*Send)(unsigned char*, unsigned short);
    signed int (*Recv)(unsigned char*, unsigned short);
} S_DEVICE;

//prototype here
static signed int I2c_Send(unsigned char* buf, unsigned short len); 

device.c

#include "protcol.h"

S_DEVICE sDevice_d = {"ten", I2c_Send, I2c_Send}; 

int main(void)
{
   return 0;
}

//define here
static signed int I2c_Send(unsigned char* buf, unsigned short len)
{
    return 0;
}

此源代码使用 ANCI C 编译器(使用 C99 扩展)编译和构建,应该会产生 在您的 Visual Studios、Win32 环境中得到类似的结果。

【讨论】:

  • 请注意,用户的示例在尝试声明sDevice_d 之前包含"Protocol.h",因此I2c_Send() 可能已在其中声明,并且不需要重新声明。此外,您的这个版本的答案甚至没有解决实际问题。 (为什么你需要做出新的答案?据我所知,系统应该允许你根据需要完全重写你的原始答案。)
  • @ElchononEdelson - 同意,我在这里这样做是为了完整性,所以我可以在发布之前证明构建。我在代码之前的文本中也提到了这一点。至于回答原始问题“错误C2099:初始化程序不是常数”,我认为新答案确实解决了这个问题。结构体未正确初始化,函数需要在使用前声明和可见。
  • 现在事情变得更清楚了。我建议您使用记事本等文本编辑器将您的答案(两者)重写为一个大答案,然后删除其中一个答案并用您更新的更正版本完全替换另一个答案的文本。
  • @ElchononEdelson - 完成。感谢您的建议和对细节的关注。
  • 还是错了,只是不一样。您可以创建一个与结构同名的别名。代码struct foo {...} 声明了一个名为struct foo 的新类型,其中变量必须声明为struct foo var_a,代码typedef struct foo {...} foo 声明了一个名为struct foo 的新类型,同时 创建一个名为foo 的别名,然后您可以将变量声明为foo var_b
猜你喜欢
  • 2020-08-14
  • 1970-01-01
  • 2011-09-02
  • 1970-01-01
  • 1970-01-01
  • 2020-02-16
  • 2011-05-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多