void Read_wav::read_wav(const string &filename)
{
}
那它在C语言中的相对应是什么?
如果我想将上述的C++函数转换成C函数,我该怎么做呢?
void Read_wav::read_wav(const string &filename)
{
}
那它在C语言中的相对应是什么?
如果我想将上述的C++函数转换成C函数,我该怎么做呢?
这意味着变量是一个引用。在C语言中没有直接的等价物。你可以把它看作是一个指针,在使用时自动取消引用,而且永远不可能为NULL(也许)。
C语言中表示字符串的典型方法是通过char
指针,因此函数可能看起来像这样:
void read_wav(struct Read_wav* instance, const char *filename)
{
}
注意:这里的第一个参数模拟了你在 C++ 中会拥有的隐式 this
对象引用,因为这看起来像是成员方法。
std::string const& filename
可能包含嵌入的空字符,为了完美地模拟 std::string
,您需要提供一个显式的 length
参数。或者,像我一样,选择使用 bstring
库。 - Matthieu M. *filename = "file.wav";
但是引用可以像原始变量一样使用:
filename = "file.wav";
引用(reference)表面上是不应该为null,虽然这种情况发生的可能性很低。
相当于C函数是:
void read_wav(const char* filename)
{
}
这是因为C语言没有string
类型。在C中通常的做法是当你需要一个字符串时发送一个指向字符数组的指针。就像在C++中,如果你输入一个字符串常量:
read_wav("file.wav");
该类型是const char*
。
void read_wav(struct Read_wav* , const char * pSzFileName)
{
}
std::string是C++处理const char数组的方式。
&是C++中的引用。它的行为就像你在处理指针一样(它主要是一种语法糖,但它提示了指针后面不应该为空的约定)。
Read_wav*
参数来替换C++中的隐式this
。 - dan04void Read_wav::read_wav(const string &filename)
{
do_read_wav(internal_read_wav, filename.c_str());
}
where do_read_wav is your C routine and internal_read_wav is a pointer to a C-style struct.
其中,do_read_wav是您的C例程,internal_read_wav是指向C风格结构体的指针。
void do_read_wav(struct Read_wav rw, const char * filename)
引用是别名,它们与指针非常相似。
std::string
是一个带有显式 length
的 char
数组(也就是说,其中可以嵌入空字符)。
有一个 C 库来模拟 std::string
(即提供封装接口),称为 Better String Library 的 bstring
。它使你免于处理两个不同变量(数组和长度)的繁琐工作。
你不能在 C
中使用类,但你可以用转发的结构体来模拟它们(以强制封装),而类方法只需成为具有显式参数的常规函数。
总之,这导致以下转换:
void Read_wav::read_wav(const string &filename);
void read_wav(struct Read_wav* this, struct bstring const* filename);
除了 struct
的噪音之外,这与你以前的代码非常相似 :)
在C++中,&符号有两个不同的用途:获取某个东西的地址(例如变量或函数)和指定变量或函数参数为对某个定义在别处的实体的引用。在您的示例中,采用了后一种含义。
C语言严格来说没有引用这样的东西,但是指针(或指向指针的指针)已经被用于类似的事情很长时间了。
有关C++中引用的更多信息,请参见http://www.cprogramming.com/tutorial/references.html,指针变量与引用变量之间的区别是什么?或http://en.wikipedia.org/wiki/Reference_(C++)。
如其他人所说,这是一个引用。 在C语言中,你可能会将函数写成以下形式:
void read_wav(struct Read_wav* rw, const char* filename)
{
}
const char * const filename
:) - GrahamS& 表示变量通过引用传递。因此,在函数内部,您将不会有变量的本地副本,而是原始变量本身。在函数内对变量所做的所有更改都会影响传递的原始变量。
string &filename
表示函数将接收一个引用(内存地址)作为参数,而不是作为副本接收。