Hungarian notation is an identifier naming convention in which the name of a variable or function is prefixed by its type or intended use. For example:

  • lAccountNum: l says the variable is a long integer.
  • szName: sz says the name is a zero-terminated string.

But today, many people are against its use. Why?


Let’s look back in history. Hungarian notation found its first major use with the BCPL programming language, which has a backronym Before C Programming Language. From that it’s easy to see this is an ancient language. Yes, it is an ancient language designed in 1966 and it is a typeless language where everything is a word. In that situation, Hungarian notation can help with naked-eye type-checking.

However, many years have passed since then…

And here’s what the latest Linux kernel documentation (as of 2016) says:

Encoding the type of a function into the name (so-called Hungarian notation) is brain damaged - the compiler knows the types anyway and can check those, and it only confuses the programmer.

Now it’s obvious why its use is discouraged now.

Two Types of Hungarian Notation

However, we should note that there are actually two types of Hungarian notation:

  • Systems Hungarian notation: The prefix encodes physical data type.

  • Apps Hungarian notation: The prefix encodes logical data type.

Because of compiler technology advancement, systems Hungarian notation is no longer recommended due to type-checking redundancy. But today’s compilers still cannot check logical data types (semantics) very well. Therefore, using apps Hungarian notation may still be helpful depending on the situation. As a rule of thumb, Hungarian notation is good if and only if it describes semantics that are not available otherwise.