if (1) int a = 2;
Run Code Online (Sandbox Code Playgroud)
这行代码是有效的 C++ 代码(至少可以编译)但无效的 C 代码(无法编译)。我知道语言之间存在差异,但这一差异是出乎意料的。
我一直以为语法是
if (expr) statement
Run Code Online (Sandbox Code Playgroud)
但这将使其在两者中都有效。
我的问题是:
我在python中编写了一个类,我希望通过IronPython将其包装到.net程序集中并在C#应用程序中实例化.我已经将类迁移到IronPython,创建了一个库程序集并引用它.现在,我如何实际获得该类的实例?
该类看起来(部分)像这样:
class PokerCard:
"A card for playing poker, immutable and unique."
def __init__(self, cardName):
Run Code Online (Sandbox Code Playgroud)
我在C#中编写的测试存根是:
using System;
namespace pokerapp
{
class Program
{
static void Main(string[] args)
{
var card = new PokerCard(); // I also tried new PokerCard("Ah")
Console.WriteLine(card.ToString());
Console.ReadLine();
}
}
}
Run Code Online (Sandbox Code Playgroud)
为了在C#中实例化这个类,我该怎么办?
我们开发了一个分布式系统,该系统是用不同编程语言(C++,C#和Python)实现的组件构建的,并通过网络相互通信.系统中的所有组件都以相同的业务概念运行,并且在这些概念方面也相互通信.
结果,我们在以下两个挑战中奋力拼搏:
这个问题的一个天真的解决方案就是定义相同的数据结构(和序列化代码)三次(对于C++,C#和Python).
不幸的是,这种解决方案有严重的缺点:
我们考虑的另一个解决方案是基于ProtoBufs或Thrift等框架.这些框架具有内部语言,其中定义了业务概念,然后这些框架自动生成C++,C#和Python(以及序列化逻辑)中这些概念的表示.
虽然此解决方案没有上述问题,但它还有另一个缺点:这些框架生成的代码将表示底层业务概念的数据结构和序列化/反序列化这些数据结构所需的代码耦合在一起.
我们认为这污染了我们的代码库 - 我们系统中使用这些自动生成的类的任何代码现在都"熟悉"这种序列化/反序列化逻辑(严重的抽象泄漏).
我们可以通过我们的类/接口包装自动生成的代码来解决它,但这使我们回到了天真解决方案的缺点.
任何人都可以推荐解决所述问题的解决方案吗?
我一直在尝试在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 库交互,该库希望我提供一个指向回调函数的指针。
据我了解,根据标准,由于调用约定可能不同,回调必须具有 C语言链接。我可以通过将回调函数声明为extern "C". 然而,这有一个不受欢迎的副作用:将函数的未限定和未混淆的名称暴露给其他翻译单元。
是否可以声明一个函数,使其名称具有内部链接(对其他翻译单元不可见),但可以仅使用标准 C++ 通过指针(具有适当的调用约定)从 C 调用?
如果不可能让它有内部链接,至少有可能让它保持它的 C++ 名称修改吗?
我试过:
static extern "C" void f();which 导致编译错误,从而导致static和extern "C"不能一起使用。namespace { extern "C" void f(); },结果证明与常规命名空间具有相同的效果,暴露了未修饰的非限定名称。我已经编写 C++ 多年,nullptr用于空指针。我也知道 C,从那里 NULL 起源,并记住它是一个空指针的常量,类型void *。
出于NULL某些原因,我不得不在我的 C++ 代码中使用某些东西。好吧,想象一下当在一些模板参数推导过程中编译器告诉我我的 NULL 真的是一个......长时我的惊讶。所以,我仔细检查了:
#include <type_traits>
#include <cstddef>
static_assert(not std::is_same<decltype(NULL), long>::value, "NULL is long ???");
Run Code Online (Sandbox Code Playgroud)
事实上,静态断言失败(使用 GCC 和 clang)。
在cppreference.com 上检查,果然(C++11 措辞):
宏 NULL 是一个实现定义的空指针常量,它可以是一个值为 0 的整数文字,或者一个类型为 的纯右值
std::nullptr_t。
为什么这是有道理的?就其本身而言,鉴于 C 的不兼容性?
我正在尝试使用CNI使用GCJ从Java调用C++,到目前为止我能够从C++调用Java代码.如何使用CNI从Java调用C++?
我的第一个问题:)
我正在使用C++(一个游戏的地图编辑器)编写的应用程序,它具有用C#编写的前端UI.因为我是C#的新手,所以我想尽可能地在C++方面做.
从C#开始,我想调用一个C++函数,该函数将返回一个带有简单变量类型(int和string)的结构列表,这样我就可以在UI中填充一个带有它们的listBox.这可能吗?我应该如何在C#中编写dll导入函数?
我试着在这里搜索答案,但我只找到了如何将列表从C#传递给C++的帖子.
C++代码:
struct PropData
{
PropData( const std::string aName, const int aId )
{
myName = aName;
myID = aId;
}
std::string myName;
int myID;
};
extern "C" _declspec(dllexport) std::vector<PropData> _stdcall GetPropData()
{
std::vector<PropData> myProps;
myProps.push_back( PropData("Bush", 0) );
myProps.push_back( PropData("Tree", 1) );
myProps.push_back( PropData("Rock", 2) );
myProps.push_back( PropData("Shroom", 3) );
return myProps;
}
Run Code Online (Sandbox Code Playgroud)
C#导入功能:
[DllImport("MapEditor.dll")]
static extern ??? GetPropData();
Run Code Online (Sandbox Code Playgroud)
编辑:
在Ed S.的帖子之后,我将c ++代码更改为struct PropData {PropData(const std :: string aName,const int aId){myName = aName; myID = aId; …
假设我正在使用一些具有函数的 C 库:
int foo(char* str);
Run Code Online (Sandbox Code Playgroud)
我知道一个事实,即foo()不会修改str. 它只是写得不好,也懒得声明str为常量。
现在,在我的 C++ 代码中,我目前有:
extern "C" int foo(char* str);
Run Code Online (Sandbox Code Playgroud)
我像这样使用它:
foo(const_cast<char*>("Hello world"));
Run Code Online (Sandbox Code Playgroud)
我的问题:原则上,从语言律师的角度来看,在实践中,我这样写是否安全:
extern "C" int foo(const char* str);
Run Code Online (Sandbox Code Playgroud)
并跳过const_cast'ing?
如果没有安全,请解释原因。
注意:我对 C++98 代码的情况特别感兴趣(是的,不幸的是我),所以如果你假设语言标准的更新版本,请这么说。