编译代码时程序失败。编译器指向printf("Version = '%s'\n", gABXVER)
。我想我实际上无法写gABXVER = "V1R1"
,但我没有其他任何想法。
class CISPFVar_BINSTR : public CISPFVar
{
protected:
char* m_pBuffer;
long m_bDefined;
public:
...
void Initialize(char* szName, long lSize, int bDefineVar = 1)
{
Uninitialize();
ZStrToCharArray(szName, m_cName, 8);
m_Size = lSize+1;
m_pBuffer = (char*)malloc(m_Size);
m_pBuffer[0] = 0;
if (bDefineVar)
ISPLINK(__VDEFINE, m_cName, m_pBuffer, __BINSTR, &m_Size);
m_bDefined = bDefineVar;
}
...
};
CISPFVar_BINSTR gABXVER;
char szLoadLibraryPath[50];
int main(
int argc,
char* argv[])
{
if (argc > 1)
if (argv[1]) strcpy(szLoadLibraryPath, argv[1]);
gABXVER.Initialize("ABXVER",4);
gABXVER = "V1R1";
printf("Version = '%s'\n", gABXVER);
return 0;
};
答案 0 :(得分:0)
在%s
系列函数中使用printf
时,相应的参数类型必须为const char*
或可转换为const char*
的内容。您使用的参数不是这种类型。也许你打算使用:
printf("Version = '%s'\n", gABXVER.m_pBuffer);
答案 1 :(得分:0)
编译器应该编译得很好(对printf可能有警告)因为printf并不关心你传递给它的东西(超出第一个参数)或者它是否与格式字符串匹配。现代编译器或错误检查程序如lint将发出警告,如果params显然不匹配,如果你有一个设置"将警告视为错误",编程可能无法编译。
也就是说,CISPFVar_BINSTR需要一个公共拷贝构造函数,如果你想把它作为一个参数传递给一个函数(因为至少在语义上会复制一个副本)。它有吗?正如其他人所说,通过提供您所拥有的任何信息来帮助您的帮助者是习惯做法。在这里,我们严重错过了编译器错误。 (您可以随时编辑您的帖子。)
我可以想象该类转换为char *或std :: string,因此尝试printf("Version = '%s'\n", (char *)gABXVER)
或printf("Version = '%s'\n", (std::string(gABXVER)).c_str() )
就足够了。
答案 2 :(得分:0)
您只能printf
具有专门为其设计的格式说明符的内容。没有格式说明符接受类类型的值,因此您不能直接printf
。
您可以做的最好的事情是将对象明确转换为const char*
并将结果传递给printf
。
答案 3 :(得分:0)
在c ++中,您可以使用许多技术来实现streaming operators
之类的内容#include <iostream>
class Whatever
{
int value = 42;
public:
int Get() const {
return value;
}
friend std::ostream& operator<<(std::ostream&, Whatever const&);
};
std::ostream& operator<<(std::ostream& os, Whatever const& what) {
os << what.Get();
return os;
}
int main() {
Whatever x;
std::cout << x << std::endl;
}
printf is unsafe
实际上,您将对象serialization转换为可读字符串。