¿Por qué puedo asignar estructuras pero no compararlos
Pregunta
A pesar de que soy un largo tiempo de programador de C, que sólo recientemente aprendido que se puede asignar directamente variables de estructura entre sí en lugar de utilizar memcpy:
struct MyStruct a,b;
...
a = b; /* implicit memcpy */
A pesar de esto se siente un poco de "alto nivel" para C, es definitivamente útil. Pero por qué no puedo hacerlo igualdad y desigualdad de comparación:
if (a == b) ...
if (a != b) ...
¿Hay alguna buena razón para el estándar de excluir esto? O se trata de una inconsistencia en el - de otra manera muy elegante - estándar?
No veo por qué puedo reemplazar mis de establecimiento de memoria para las tareas de limpieza, pero tengo que mantener a esos feos de memcmp en su lugar.
Solución
No hay una buena manera para que un compilador para implementar la estructura de comparación (Es decir, para apoyar el operador == para estructuras) que es consistente con sabor de bajo nivel de C. Un simple byte a byte de comparación podían fundador en bits aleatorios presentes en no utilizada "agujeros" en la estructura (tales el relleno se utiliza para mantener la alineación de la tarde campos correctos). Una comparación por campo campo podría requerir cantidades inaceptables de código repetitivo para estructuras grandes. Cualquier comparación generado por el compilador No se podía esperar para comparar los punteros adecuadamente en todas las casos: por ejemplo, es a menudo apropiado comparar campos char * con strcmp en lugar de ==.
Si es necesario comparar dos estructuras, que tendrá que escribir su propia función para hacerlo, campo por campo.