【问题标题】:Variably modified at file scope error在文件范围错误处进行可变修改
【发布时间】:2015-11-24 21:01:40
【问题描述】:

我有一个完美运行的程序,它具有以下结构

typedef struct SERVER{
    int id;
    char ip_addr[MAX_IP + 1];
    int port;
}SERVER;

MAX_IP 在头文件中定义。

#define MAX_IP strlen("255.255.255.255")

这段代码在我的本地机器上运行良好。当我将它上传到服务器时,我得到以下编译错误。

objs.h:4:10: error: variably modified ‘ip_addr’ at file scope
     char ip_addr[MAX_IP + 1];

可能有什么问题。

【问题讨论】:

  • 感谢指出,已更新。

标签: c


【解决方案1】:
typedef struct SERVER{
    int id;
    char ip_addr[MAX_IP + 1];
    int port;
}SERVER;

上述结构定义在 C 中无效,因为结构成员不允许具有可变长度数组类型。 MAX_IP + 1 必须是整数常量,并且在 C 中函数调用(您的 MAX_IP 被定义为 strlen("255.255.255.255"))不是常量。

要解决您的问题,您可以改用 MAX_IP 的定义:

#define MAX_IP  (sizeof "255.255.255.255" - 1)

具有相同的值并且是一个整数常量。

【讨论】:

  • @Antithesis - 不,它不是一个常数。它是函数调用的返回值。
  • 那么我该如何重构这段代码。它在本地也可以正常工作。
  • @Antithesis 使用(sizeof "255.255.255.255" - 1),它是一个常数,具有相同的值。
  • @antithesis 那么你的编译器没有遵循 C 标准。具有函数返回值长度的数组在 C 中是非法的。
  • @Antithesis 那么我该如何重构这段代码。 strlen() 是做什么的?
【解决方案2】:
strlen("255.255.255.255")

不是常数。因此,您尝试使用可变长度数组来打破规则。

【讨论】:

    【解决方案3】:

    由于您总是采用固定字符串的 strlen,是否可以将 MAX_IP 的定义更改为常量,而不是每次使用宏时都嵌入函数调用?如果您的标头用户没有(或不能拥有)内置的标准库,他们就会遇到问题。

    如果不是,您能否详细说明一下服务器和代码工作所在的机器之间的区别?

    【讨论】:

      猜你喜欢
      • 2013-02-02
      • 1970-01-01
      • 2014-03-07
      • 2013-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-15
      相关资源
      最近更新 更多