C 在文件范围处可变修改错误
我有一个完美的工作程序,它有以下结构C 在文件范围处可变修改错误,c,C,我有一个完美的工作程序,它有以下结构 typedef struct SERVER{ int id; char ip_addr[MAX_IP + 1]; int port; }SERVER; 最大IP在头文件中定义 #define MAX_IP strlen("255.255.255.255") 这段代码在我的本地机器上运行良好。当我将其上传到服务器时,我得到了以下编译错误 objs.h:4:10: error: variably modified ‘ip_addr’
typedef struct SERVER{
int id;
char ip_addr[MAX_IP + 1];
int port;
}SERVER;
最大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];
可能有什么问题
typedef struct SERVER{
int id;
char ip_addr[MAX_IP + 1];
int port;
}SERVER;
上面的结构定义在C中无效,因为不允许结构成员具有可变长度数组类型MAX\u IP+1
必须是一个整数常量,在C中,函数调用(您的MAX\u IP
被定义为strlen(“255.255.255.255”)
)不是常量
要解决您的问题,您可以使用此定义的MAX\u IP
:
#define MAX_IP (sizeof "255.255.255.255" - 1)
它具有相同的值,是一个整型常量
strlen("255.255.255.255")
这不是一个常数。因此,尝试使用可变长度数组是违反规则的。由于您总是使用固定字符串的strlen,是否可以将MAX_IP的定义更改为常量,而不是在每次使用宏时嵌入函数调用?如果标头的用户没有(或不能)内置标准库,则他们将遇到问题
如果没有,您能详细说明服务器和代码运行的机器之间的区别吗?感谢您指出,并进行了更新。@antipthesis-不,这不是一个常数。它是函数调用的返回值。那么我如何重新构造代码呢。此外,它在本地工作正常。@Antitthesis使用
(sizeof“255.255.255.255”-1)
,这是一个常量,具有相同的值。@Antitthesis则编译器不遵循C标准。具有函数返回值长度的数组在C.@Anthesis中是非法的,因此如何重新构造此代码。strlen()的作用是什么?