需要帮助理解c++.h文件

Need help understanding c++ .h file

本文关键字:c++ 文件 助理 帮助      更新时间:2023-10-16

我正试图用C#为我需要使用的非托管C/C++dll编写一个包装器。在这个过程中,我正在努力摆脱我非常古老的C++技能的锈迹。在.h文件中,我看到了下面的代码。

png_demand_record_create(const char *name, const char* loc, int date, int quantity);

前两个参数是srings,后两个是整数。。。。正确的我似乎记得c中真的没有字符串,而是一个字符数组之类的。*name不是指向字符数组的指针吗?为什么第二个参数中的*在char中是在"r"之后,而不是在loc中的"l"之前??这两个参数之间的区别是什么?这是否只是作者的键入,这真的无关紧要?

此外,我正在使用一个工具(Pinvoker)来帮助我为对非托管dll的调用编写C#包装器(我只有.h文件和编译后的dll)。该工具给了我以下信息:

[DllImport(@"C:Some.dll", SetLastError = true, CallingConvention = CallingConvention.Cdecl)]
    public extern static png_demand_record_t png_demand_record_create([MarshalAs UnmanagedType.LPStr)] string name,
[MarshalAs(UnmanagedType.LPStr)] string loc, 
int date,
int quantity);

在我看来,该工具对"name"answers"loc"的定义是相同的,尽管它们在.h文件中不同。我需要担心这个吗?

非常感谢!

回答您的第一个问题:它们完全相同。char* strchar *str相同,char*strchar * str相同,等等。

至于C#,恐怕我在那里帮不了什么忙。

如果你感兴趣,或者是相关的,这里有关于c字符串的维基百科页面(这就是你在这里处理的内容)。

之间没有区别

const char* loc

const char *loc

一些程序员更喜欢前者,认为*是类型的一部分。一些程序员更喜欢后者,因为*实际上只应用于该声明中的一个变量:

char *foo,bar;

在这种情况下,只有foo是指针;bar是一个简单的char。(这就是为什么我更喜欢char *foo。)

因为在这种情况下它们是相同的,所以在Pinvoker工具中应该对它们进行相同的处理——除非其中一个是输入参数,另一个是输出,否则可能会发生这种情况。请务必理解要包装的API,以确保您知道哪些是输入,哪些是输出——如果有,则是双向

1)*周围的空白并不重要,这两种参数类型是相同的
2) Pinvoker将参数整理如下:

...
[MarshalAs(UnmanagedType.LPStr)] string name,
[MarshalAs(UnmanagedType.LPStr)] string loc, 
...

所以,也没有什么区别。