Modificado de forma variable en el error de alcance de archivo -- amp Relacionados El problema

Variably modified at file scope error


2
vote

problema

Español

Tengo un programa perfectamente de trabajo que tiene una estructura siguiente

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

max_ip se define en un archivo de encabezado.

  #define MAX_IP strlen("255.255.255.255")   

Este código se ejecuta bien en mi máquina local. En el momento en que lo subo a un servidor, obtengo el siguiente error de compilación.

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

qué podría estar mal.

Original en ingles

I've a perfectly working program that has a following struct

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

MAX_IP is defined in a header file.

#define MAX_IP strlen("255.255.255.255") 

This code runs fine on my local machine. The moment I upload it to a server I get the following compilation error.

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

What could possibly be wrong.

  
 
 

Lista de respuestas

1
 
vote
vote
La mejor respuesta
 
  d7  

La definición de estructura anterior no es válida en C a medida que los miembros de las estructuras no se permiten, no tienen un tipo de matriz de longitud variable. d8 tiene que ser una constante entera y en C a una llamada de función (su d9 que se define como begin0 ) no es una constante.

Para solucionar su problema, puede usar esta definición de begin1 en su lugar:

  begin2  

que tiene el mismo valor y es una constante entera.

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

The structure definition above is not valid in C as stuctures members are not allowed not have variable length array type. MAX_IP + 1 has to be an integer constant and in C a function call (your MAX_IP being defined as strlen("255.255.255.255")) is not a constant.

To fix your issue you can use this definition of MAX_IP instead:

#define MAX_IP  (sizeof "255.255.255.255" - 1) 

which has the same value and is a integer constant.

 
 
         
         
1
 
vote
  begin3  

no es una constante. Y por lo tanto, estás rompiendo las reglas tratando de tener una matriz de longitud variable.

 
strlen("255.255.255.255") 

Is not a constant. And thus, you're breaking the rules by trying to have a variable length array.

 
 
0
 
vote

Dado que siempre está tomando una estrellina de una cadena fija, ¿sería posible cambiar la definición de max_ip a una constante, en lugar de incrustar una llamada de función cada vez que se usa la macro? Si el usuario de su encabezado no tiene (o no puede tener) la biblioteca estándar incorporada, tendrán problemas.

Si no, ¿puede elaborar más sobre cuáles son las diferencias entre el servidor y su máquina donde funciona el código?

 

Since you are always taking a strlen of a fixed string, would it be possible to change the definition of MAX_IP to a constant, rather than embed a function call every time the macro is used? If the user of your header doesn't have (or can't have) the standard library built in, they will have issues.

If not, can you elaborate more on what the differences are between the server and your machine where the code works?

 
 

Relacionados problema

63  ¿Hay alguna manera de encontrar todas las funciones expuestas por un DLL?  ( Is there a way to find all the functions exposed by a dll ) 
He estado buscando una forma de obtener todas las cadenas que el mapa para funcionar con los nombres de funciones en una DLL. Quiero decir con esto todas la...

1  Recuperar múltiples filas de una fuente ODBC con una consulta de unión  ( Retrieve multiple rows from an odbc source with a union query ) 
Estoy recuperando múltiples filas en un control LISTVIEW desde una fuente ODBC. Para selecciones simples, parece funcionar bien con un atributo de declaración...

4  Marcos de prueba para C [CERRADO]  ( Testing frameworks for c ) 
Según lo que actualmente representa, esta pregunta no es un buen ajuste para nuestro Q & Amp; un formato. Esperamos que las...

35  ¿Tipo a utilizar para representar un byte en ANSI (C89 / 90) C?  ( Type to use to represent a byte in ansi c89 90 c ) 
¿Hay un método de queja de estándares para representar un byte en ANSI (C89 / 90) C? Lo sé, la mayoría de las veces, un char sucede que es un byte, pero mi co...

4  Optimizar y = x * x en el campo de campo de galois aritmética  ( Optimize y xx in galois field arithmetic ) 
Tengo este código C para hacer multiplicaciones sobre GF (8): int32_t GaloisMultiply (int32_t a, int32_t b) { int32_t i; int32_t mask = 0x100; ...

20  Formato de audio de RockBox  ( Rockbox audio format ) 
¿Cómo especifica una devolución de llamada para rb->pcm_play_data() ? ...

36  Implementación GTK de MessageBox  ( Gtk implementation of messagebox ) 
He estado tratando de implementar el DataSet1111 usando GTK. La aplicación utiliza SDL / OpenGL, por lo que esto no es una aplicación GTK. MANEJO LA INICI...

13  ¿Es seguro usar Getenv () en los inicializadores estáticos, es decir, antes de la principal ()?  ( Is it safe to use getenv in static initializers that is before main ) 
Miré en Stevens , y en el Guía de Posix Programmer , y lo mejor que puedo encontrar es Una matriz de cadenas llamada Enviroment está disponible cuando ...

164  Cómo usar la API de C Socket en C ++ en Z / OS  ( How to use the c socket api in c on z os ) 
Tengo problemas para que la API de los sockets de C funcione correctamente en C ++ en Z / OS. Aunque estoy incluyendo sys/socket.h , Sigo obtengo los error...

17  ¿Por qué estoy obteniendo un error de doble libre o corrupción con RealLOC ()?  ( Why am i getting a double free or corruption error with realloc ) 
He intentado escribir una función de reemplazo de cadena en C, que funciona en un char * , que se ha asignado utilizando malloc() . Es un poco diferente, ya...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos