dovrebbe funzionare anche su mac su linux non sono sicuro, prova al massimo.

Allora fai così:

se è sotto windows: //ovviamente defi usare i #define:

codice:
#ifdef USA_WINDOWS

//blabla

#endif

#ifdef USA_MAC

//etc etc etc

#endif

#ifdef USA_LINUX

//etc

#endif

//ci sono poi define già definiti da compilatore WIN_32 mi pare sia uno di quelli, quindi se metti quelli giusti non serve che stai a inizio programma a scrivere
#define USA_WINDOWS

ma li definisce già il compilatore
ma
Guarda sopra,

se è sotto machintosh

codice:
Bundle = CFBundleGetMainBundle();
path = CFBundleCopyBundleURL(Bundle);
se è sotto linux ho trovato questo codice (che da prima occhiata mi sempre codice standard che va bene per tutti gli OS!)

codice:
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

int main(int argc, char *argv[]) 
{  
char path[256];  
char id[256];  
sprintf(id, "/proc/%d/exe", getpid());  
readlink(id, path, 255);  
path[255] = '\0';  
printf("%s\n", path);  
return 0;
}
Non sei ancora soddisfatto?

Usa le funzioni fornite dalla BOOST:

codice:
boost::filesystem::path curPath = boost::filesystem::current_path();
std::string strPath = curPath.string();
std::cout<<strPath;
e potrei stare qui a elencarti ancora metodi, provali e scegli quello che ti piace di più, la cosa certa è che argv[0] e tutto meno che portabile, quindi se lo vuoi usare, a tuo rischio, io di metodi migliori te ne ho mostrati tanti.