ODBC är användbart om du vill ha en standardadapter som talar ett liknande API för olika databaser. Jag tycker personligen att det är ett hemskt API, men det är allmänt förstått och väldokumenterat.
libpq pratar mer direkt med PostgreSQL. Du kan få bättre prestanda med det, men förmodligen inte tillräckligt mycket mer för att det kommer att göra någon skillnad för de flesta appar, som spenderar tid på att köra frågor, nätverkslatens etc, inte i klientbiblioteket.
Nyare versioner av psqlODBC är byggda på libpq och fungerar som ett ODBC-omslag för libpq.
Det finns också libdbi, som erbjuder ett mindre hemskt API än ODBC.
För fullständighetens skull finns det även server-backend SPI, som kan användas av användardefinierade funktioner skrivna i C och laddade in i PostgreSQL-servern. Det är inte användbart utanför servertillägg och funktioner.
Åh, och det finns ecpg. Använd inte ecpg. Det är ett superlegacy språkintegrerat-SQL-verktyg som huvudsakligen finns för enklare portering från vissa andra databasmotorer. Använd inte ecpg. Verkligen.
För C++ finns QtSQL-gränssnittet (ovanligt för Qt, det är fruktansvärt och smärtsamt begränsat, använd det inte) och libpq++ (OK men i stort sett ounderhållet).
Personligen skriver jag libpq-kod direkt, men det beror på att jag arbetar med kod som vanligtvis går in i PostgreSQL själv. Om du inte kan föreställa dig att någonsin vilja rikta in dig på något förutom PostgreSQL kanske du vill skriva libpq-kod; annars använd förmodligen ODBC med psqlODBC.