我想在我們的C++項目中嵌入Python 3.3。 Python 3.3似乎已經引入了UTF-8作爲首選存儲,PEP 393:「該規範選擇UTF-8作爲將字符串暴露給C代碼的推薦方式。」Python 3.3 C字符串處理(wchar_t vs char)
我寫了這個初始化代碼,這似乎是簡單而直觀:
#include <Python.h>
#include "log.h"
void python_init(const char *program_name) {
if (not Py_IsInitialized()) {
Py_SetProgramName(program_name);
Py_Initialize();
const char *py_version = Py_GetVersion();
log::msg("initialized python %s", py_version);
}
}
但編譯失敗:
/home/jj/devel/openage/src/engine/python.cpp:13:3: error: no matching function for call to 'Py_SetProgramName'
Py_SetProgramName(program_name);
^~~~~~~~~~~~~~~~~
/usr/include/python3.3/pythonrun.h:25:18: note: candidate function not viable: no known conversion from 'const char *' to 'wchar_t *' for 1st argument
PyAPI_FUNC(void) Py_SetProgramName(wchar_t *);
^
所以,是的,很明顯,我需要一個wchar_t *
這裏,但我不沒有看到任何理由爲什麼char *
不會在這裏做這項工作。
這裏的最佳做法是什麼? 轉換char *
到wchar *
並處理區域設置(mbstowcs),這也會引入不必要的動態內存分配?
此外,如果Python決定完全去wchar
,爲什麼Py_GetVersion()
返回char *
像我預料的那樣?
我發現similar question for Python <3.3,但我希望Python 3.3不同(PEP 393?)。
該代碼必須具有跨平臺功能。
=>什麼是將C字符串(char *
)傳遞給Python 3.3的快速高效的解決方案?
你試過'char *'而不是'const char *'嗎? –