ODBC es útil si desea un adaptador estándar que hable una API similar para diferentes bases de datos. Personalmente, creo que es una API horrible, pero se entiende ampliamente y está bien documentada.
libpq habla más directamente con PostgreSQL. Puede obtener un mejor rendimiento con él, pero probablemente no lo suficiente como para que marque la diferencia para la mayoría de las aplicaciones, que dedican tiempo a la ejecución de consultas, la latencia de la red, etc., no en la biblioteca del cliente.
Las versiones más nuevas de psqlODBC se basan en libpq y funcionan como un envoltorio ODBC para libpq.
También está libdbi, que ofrece una API menos espantosa que ODBC.
Para completar, también está el SPI de back-end del servidor, que puede ser utilizado por funciones definidas por el usuario escritas en C y cargadas en el servidor PostgreSQL. No es útil fuera de las extensiones y funciones del servidor.
Ah, y hay ecpg. No utilice ecpg. Es una herramienta SQL integrada en el lenguaje súper heredada que existe principalmente para facilitar la migración desde otros motores de bases de datos. No utilice ecpg. De verdad.
Para C++ está la interfaz QtSQL (inusualmente para Qt, es horrible y dolorosamente limitada, no la use) y libpq++ (OK pero en gran parte sin mantenimiento).
Personalmente, escribo el código libpq directamente, pero eso es porque estoy trabajando en un código que generalmente se incluye en PostgreSQL. Si no puede imaginar querer apuntar a nada que no sea PostgreSQL, es posible que desee escribir código libpq; de lo contrario, probablemente use ODBC con psqlODBC.