В C, включая один стандартный заголовок, было , а не разрешено вести себя так же, как и любой другой стандартный заголовок.Это позволило избежать проблемы, с которой вы сталкиваетесь, при значительных затратах на реализацию трудностей.
C ++ позволяет любому стандартному заголовку включать любой другой стандартный заголовок.Это значительно упрощает реализацию, но может привести именно к той проблеме, с которой вы столкнулись, когда включение, казалось бы, не связанного заголовка сделало функцию видимой, которую вы на самом деле не хотели использовать, вместо того, чтобы получить ошибку, потому что функцияВы использовали, не заявлено вообще.
К сожалению, я не думаю, что есть простой способ справиться с этим.Хотя довольно просто представить, что <iostream>
не зависит от <stdlib.h>
, гораздо проще понять, как ему могут понадобиться / нужны определения таких вещей, как ios_base
.Потребовалось бы немного дополнительной работы, чтобы определить вещи, чтобы запретить первое, допуская второе.
Я должен отметить, однако, что со временем ситуация, кажется, немного улучшается.Десять лет назад было довольно распространено получать практически все стандартные заголовки, включая почти любой из них.Хотя большинство из них по-прежнему включают по крайней мере несколько из них, которые не являются строго обязательными, они обычно намного ближе к каждому, определяя только то, что требуется.