2008年12月4日星期四

一些小问题

int snprintf(char *restrict buf, size_t n, const char * restrict format, ...);

函数说明:最多从源串中拷贝 n 1 个字符到目标串中,然后再在后面加一个 0 。所以如果目标串的大小为 n 的话,将不会溢出。函数返回值:若成功则返回欲写入的字符串长度,若出错则返回负值。

_snprintf(variable, sizeof(variable), "SDL_WINDOWID=0x%lx", winId());
//snprintf(variable, sizeof(variable), "SDL_WINDOWID=0x%lx", winId());
snprintf函数并不是标准c/c++中规定的函数,但是在许多编译器中,厂商提供了其实现的版本。
在gcc中,该函数名称就snprintf,而在VC中称为_snprintf。但是我在编译的过程中,使用_snprintf就不会出现warning,若使用snprintf则会出现warning。

qmake 不会处理.cpp文件里的Q_OBJECT,所以,如果在.cpp文件中有它的话,也会产生undefined reference to vtable for "xxx::xxx". 这时,需要先用moc xxxx.cpp生成相应的moc文件,再包含到.cpp里面去,才能解决这个问题.
要解决上面的问题
如果分开, 可能就没问题, 包括 h和 cpp 分开。在你main.cpp 最后加一行 #include "main.moc" from:http://blog.donews.com/netexe/archive/2006/02/09/720544.aspx

from: http://lists.mplayerhq.hu/pipermail/ffmpeg-user/2007-March/007669.html
The correct order is -lavformat -lavcodec -lavutil. It doesnt matter 
when you use dynamic linking, but with static libs it does, because ld
does *not* scan static libraries repeatedly, only once (that is, once
per -l option).

#include
#include // < > 代表是用.PRO INCLUDEPATH引用的
#include "mediaplayer.h" // " " 代表是在现存Project中的文档

如何在C++中调用已经被编译好的C函数?这时必须采用“混合编译”,例如:
extern "C"
{
#include
#include
}
这里调用了ffmpeg的头文件avformat.h和avcodec.h,为了解决C++不能编译C的问题,
这里必须加在extern"C"里。原因:例如函数abcd()被C编译器编译后在库中的名字为_abcd,
而C++编译器则会产生_abcd_int_int之类的名字用来支持
函数重载和类型安全连接。由于编译后的名字不同,C++程序不能直接调用C函数。
C++提供了一个C连接交换指定符号extern “C” 来解决这个问题。

没有评论: