Большинство компиляторов не делает никакого вида оптимизации в отладочная сборка.
При использовании VC, попробуйте сборку конечных версий включенной информацией PDB - это позволит Вам проследить через оптимизированное приложение, и необходимо, надо надеяться, видеть то, что Вы хотите тогда. Обратите внимание, однако, что отладка и трассировка оптимизированной сборки перейдут Вы вокруг повсеместно, и часто Вы не можете осмотреть переменные непосредственно, поскольку они только когда-либо заканчиваются в регистрах или оптимизированы далеко полностью. Это - "интересный" опыт...
Не имеет значения, реализована ли ваша реализация функций перехвата на C или на C ++. Фактически, я уже видел некоторые расширения Python, которые активно используют шаблоны C ++ и даже библиотеку Boost. Нет проблем. : -)
У разработчиков Boost есть хороший автоматизированный способ обертывания кода C ++ для использования Python.
Он называется: Boost.Python
Он имеет дело с некоторыми конструкциями C ++ лучше, чем SWIG, особенно метапрограммирование шаблонов.
Что вас интересует, так это программа под названием SWIG . Он будет генерировать оболочки и интерфейсы Python для кода C ++. Я использую его с шаблонами, наследованием, пространствами имен и т. Д., И он хорошо работает.
Вы должны уметь использовать все возможности языка C ++. В Расширяющей документации Python (2.6.2) говорится, что вы можете использовать C ++, но упоминаются следующие предостережения:
Можно написать расширение модули на C ++. Некоторые ограничения применять. Если основная программа (Python интерпретатор) компилируется и связывается компилятор C, глобальный или статический объекты с конструкторами не могут быть используемый. Это не проблема, если основная программа связана с C ++ компилятор. Функции, которые будут вызывается интерпретатором Python (в в частности, инициализация модуля functions) должны быть объявлены с использованием внешний "C". Нет необходимости вложите файлы заголовков Python в extern "C" {...} - они используют эту форму уже, если символ __cplusplus определены (все последние компиляторы C ++ определите этот символ).
Первое ограничение, «нельзя использовать глобальные или статические объекты с конструкторами», связано с тем, как большинство компиляторов C ++ инициализируют объекты с этим типом продолжительности хранения. Например, рассмотрим следующий код:
class Foo { Foo() { } };
static Foo f;
int main(int argc, char** argv) {}
Компилятор должен выдать специальный код, чтобы конструктор 'Foo' вызывался для 'f' перед выполнением main. Если у вас есть объекты со статической продолжительностью хранения в вашем расширении Python и , интерпретатор Python не скомпилирован и не связан для C ++, то этот специальный код инициализации не будет создан.
Второе ограничение: «Функции, которые будет вызываться интерпретатором Python (в частности, функции инициализации модуля) должны быть объявлены с использованием extern "C" ", имеет отношение к изменению имени C ++. Большинство компиляторов C ++ искажают свои имена, чтобы они могли использовать те же компоновщики, что и для цепочек инструментов C. Например, у вас есть:
void a_function_python_calls(void* foo);
компилятор C ++ может преобразовывать ссылки на имя 'a_function_python_calls' во что-то вроде 'a_function_python_calls @ 1vga '. В этом случае вы можете получить неразрешенное внешнее сообщение при попытке связи с библиотекой Python.