Lattice codes can achieve the capacity of additive white Gaussian noise channel with and without power construction. It is well known that lattice codes can provide a classical information theoretic way to obtain achievable rate and performance gains for point-to-point Gaussian channels. The coding scheme based on lattice codes can be used as building blocks for practical applications, such as point-topoint communication systems, Gaussian networks and MIMO communication systems etc. More importantly, lattice codes can be used to investigate new link adaptive coding and modulation schemes and design sparse code multiple access codebooks. So, lattice codes could be a potential candidate for 5G communication. This paper provides a comprehensive review of the state-of-the-art of lattice codes. It first describes the theory of lattice codes. Then, a comprehensive survey to easily understand channel capacity, error exponents and practical lattice codes is outlined. The application of nested lattice codes is also presented for lossy source coding, dirty paper channel coding and relay communication. Finally, some unresolved issues and ongoing developments related to further improvements of lattice codes are highlighted.