这段代码发生了什么?太令人困惑了.
#include <utility>
struct check
{
template <typename T>
auto foo() -> decltype(std::declval<T>().value, void())
{
static_assert(T{}.value == 10, "Incorrect value");
}
} var;
int main()
{
struct apple
{
int value{10};
};
var.foo<apple>();
}
Run Code Online (Sandbox Code Playgroud)
特别是它所拥有的部分->以及之后的一切.
我一直在尝试在C++应用程序中嵌入不同的脚本语言,目前我正在尝试Stackless Python 3.1.我已经尝试了几个教程和示例,我可以找到的很少,尝试从应用程序运行一个简单的脚本.
Py_Initialize();
FILE* PythonScriptFile = fopen("Python Scripts/Test.py", "r");
if(PythonScriptFile)
{
PyRun_SimpleFile(PythonScriptFile, "Python Scripts/Test.py");
fclose(PythonScriptFile);
}
Py_Finalize();
Run Code Online (Sandbox Code Playgroud)
出于某些奇怪的原因,运行此代码会导致访问冲突:
PyRun_SimpleFile(PythonScriptFile, "Python Scripts/Test.py");
Run Code Online (Sandbox Code Playgroud)
我在网上搜索了类似问题的其他人,发现只有一个.他们唯一的解决方案是只在老版本的Python中才有可能的解决方法:创建一个python文件对象并将该python文件对象返回FILE*到PyRun_SimpleFile.但是,这样的函数调用不可用,Python 3.1 API从文件描述符创建文件对象并返回文件描述符,但该PyRun_SimpleFile函数仍然需要FILE*.
我不知道如何从文件中运行任何脚本,没有手动将整个文件加载到内存中并将其作为一个巨大的字符串运行,当然不是一个实用的解决方案.
是什么赋予了?如果API有内部错误,我该如何完成此任务?
更新:我已经设法从源代码构建Stackless Python 3.1,尽管使用了相同的C运行时库,但崩溃仍然完全没有变化.我的项目和Stackless Python 3.1源都是使用Visual Studio 2010的C++编译器和C运行时构建的.我不再对可能解决这个问题的问题有所了解,只是修改Python以使用文件名而不是FILE*.另一个可怕的解决方法.
有没有办法使用用户宏/环境变量在解决方案中定义项目文件路径?我似乎无法做到这一点.
有点像环境变量用于在C++项目中定义附加的包含目录,除了我想对解决方案中项目文件的位置做同样的事情.
我已经尝试在文本编辑器中编辑解决方案以更改以%MyMacroName%或$(MyMacroName)开头的路径,但它们似乎都没有解析得恰到好处.打开解决方案时无法找到项目文件.
projects-and-solutions environment-variables visual-studio-2010 visual-studio
Microsoft不建议使用DirectInput进行键盘和鼠标输入.因此,我编写了一个输入管理器类,它使用SetWindowsHookEx挂钩到WndProc和GetMsg.我认为钩子设置得恰当,但它们看起来是各种问题的原因.
我的WndProc和GetMsg挂钩都不会收到实际WndProc正在接收的任何消息.我的输入管理器永远不会收到它需要的WM_INPUT,WM_ BUTTON,WM_MOUSEWHEEL和WM_KEY*消息.
是什么赋予了?
部分标题:
namespace InputManager
{
class CInputManager
{
HWND m_Window;
HHOOK m_WndProcHook;
HHOOK m_GetMessageHook;
static LRESULT CALLBACK WindowsProcedureHookProcedure(int Code, WPARAM WParameter, LPARAM LParameter);
static LRESULT CALLBACK GetMessageHookProcedure(int Code, WPARAM WParameter, LPARAM LParameter);
static LRESULT CALLBACK MessageHandler(HWND Window, UINT Message, WPARAM wParameter, LPARAM lParameter);
};
}
Run Code Online (Sandbox Code Playgroud)
部分来源:
namespace InputManager
{
bool CInputManager::Initialize(HWND Window)
{
m_Window = Window;
// Hook into the sent messages of the target window to intercept input messages.
m_WndProcHook = SetWindowsHookEx(WH_CALLWNDPROC, &(WindowsProcedureHookProcedure), NULL, GetCurrentThreadId()); …Run Code Online (Sandbox Code Playgroud) 我可能弄错了,但我发现的基本解释是联合无法初始化,因为它不知道要调用哪个成员的构造函数.编译器无法自动为union生成构造函数.
为什么不允许用户定义联合构造函数?这将删除所述问题并允许存在具有非平凡构造函数/析构函数的联合成员.
另外,为什么联盟成员不能有任何自定义构造函数?前面的解释不代表自定义构造函数.
更新1:
例:
struct SQuaternion
{
union
{
S3DVector Axis;
struct
{
float X;
float Y;
float Z;
};
};
float W;
};
Run Code Online (Sandbox Code Playgroud)
注意:这里的问题似乎是联盟是匿名的.因此,如何命名联盟的构造函数?似乎不可能这样做,仅仅因为它没有名字,没有其他原因.如果这是一个简单的词汇问题,那将是一个可怕的原因......
更新2:只需将有问题的成员包装在一个封闭的匿名结构中,错误就会消失.我想这是一个与匿名联盟最接近的事情.它不再是一个问题的事实似乎仍然很奇怪......
我正在尝试为我的C/C++/C#/ Java/D类编程语言编写一个扫描程序,这是我出于个人原因设计的.为此,我正在使用Ragel生成扫描仪.我很难理解许多操作员何时触发行动,可能是因为我的学者专注于实践知识而不是理论,而且大量的这种非确定性/确定性有限自动机业务正好在我脑海中.我发现文档要么缺乏,要么我对它的理解是如此.我假设后者.
无论如何,我正在从基础开始.我在第一次迭代中发现了几个关键字和特殊字符.现在我遇到了所有关键字都被扫描为标识符的问题.我正在使用扫描仪操作符来处理我的所有关键字,因为这解决了我的字符串returns被扫描为return和returns关键字的问题.
如何正确扫描标识符?我理解为了使这个确定性,我需要有效地指定lexeme只能是一个identifier如果它不匹配其他令牌的模式.原谅我缺乏知识.
Ragel脚本:
%%{
Identifier = (alpha | '_') . (alnum | '_')*;
action IdentifierAction
{
std::cout << "identifier(\"";
std::cout.write(ts, te - ts);
std::cout << "\")";
}
}%%
%%{
main :=
|*
Interface => InterfaceAction;
Class => ClassAction;
Property => PropertyAction;
Function => FunctionAction;
TypeQualifier => TypeQualifierAction;
OpenParenthesis => OpenParenthesisAction;
CloseParenthesis => CloseParenthesisAction;
OpenBracket => OpenBracketAction;
CloseBracket => CloseBracketAction;
OpenBrace => OpenBraceAction;
CloseBrace => CloseBraceAction;
Semicolon => SemicolonAction;
Returns => …Run Code Online (Sandbox Code Playgroud)