Не оптимально, но отлично работает:
int main(int argc, char **argv) {
using namespace std;
char buffer[MAXPATHLEN];
realpath(argv[0], buffer);
string fullpath = buffer;
fullpath = string(fullpath, 0, fullpath.rfind("/"));
cout << fullpath << endl;
}
Для относительного пути я использую realpath (), который специфичен для Unix / Linux. Для окон вы можете использовать GetModuleFileName (NULL, buffer, MAXPATHLEN), и, конечно, разделитель не тот.