Следует понимать что именно делает ви;уал студия когда ты просишь скомпилить проект. Три основных этапа:
Создание единиц трансляции
На этом этапе каждый компилируемый файл (*.cpp включённый в проект) обрабатывает препроцессор: подставляет вместо "#include" код из файлов, убирает код в блоках игнорирумых "#if", подставляет все макросы "#define" и удалит комментарии.
Кстати есть интересный финт с препроцессором, который немногие знают:
// words.h
"he",
"she",
"it"
// main.cpp
const std::string words[] =
{
#include "words.h"
};
int main(int, char**)
{
std::cout << words[1];
return 0;
}
в результате будет
>>> she
Компиляция ресурсов. На данном этапе каждая единица трансляции компилируется в объектный файл с расширением ".obj".
Линковка. Она же компоновка. Исполняемый файл начинает выполнение с точки входа. Линковщику можно задать эту точку входа. По умолчанию в консольных приложениях винды это функция "main". Линковщик начнёт с того, что пройдётся по всем объектным файлам, найдёт эту функцию и начнёт с неё создавать ".exe" файл. Потом отыщет все функции, которые используются в программе, добавит их в исполняемый файл, а вызовы их имён заменит вызовами по соответствующим адресам.
Исходя из этого можно предложить несколько вариантов:
Использовать комментарии для переопределения точки входа.
Использовать препроцессор (#if #elif #else #endif).
Использовать разные точки входа линковщика.
Во время исполнения программы отслеживать устройство ввода (клавиатура, файл) и выполнять соответствующий участок кода.