如何使函数声明在结果中有char序列?
我现在有这个:
#define _MAX_PATH 260
char * GetTempFileName(char fileName [_MAX_PATH]);
但结果应该是char [_MAX_PATH]
类型#include <array>
typedef std::array<char,_MAX_PATH> Path;
extern class Setts
{
char path [_MAX_PATH];
public:
Setts();~Setts();
Path getTempFileName(const Path &fileName);
} setts;
Setts::~Setts(){}
Path Setts::getTempFileName(const Path &fileName)
{
GetCurrentDirectory(_MAX_PATH, path);
strcat(path, "\\");
strcat(path, fileName);
return path;
}
这就是我的问题......
error C2143: syntax error : missing ';' before 'Setts::GetTempFileNameA'
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
error C2556: 'int Setts::GetTempFileNameA(Setts::Path)' : overloaded function differs only by return type from 'Setts::Path Setts::GetTempFileNameA(Setts::Path)'
是否真的不可能在char序列char [_MAX_PATH]中得到结果?这里的问题是,当我创建新类型Path时,所有依赖于char [_MAX_PATH]类型的条件函数都会导致项目中的错误。
来自g-makulik的评论
什么意思是path.data()...数据看起来像某些功能,什么 这样做吗?是否在函数结果后进行评估 保存到路径变量? - user1141649 16分钟前
g-makulik:
It provides access to the std::array's underlying data (an array of char[260]). You can use it in other places to interface that array as well. –
我试图简化它,因为与项目其余部分的兼容性:
settings.h:
#include <stdlib.h>
#include <iostream>
#include <array>
typedef char Path [_MAX_PATH];
extern class Setts
{
Path& path;
public:
Setts();~Setts();
Path& getTempFileName(const Path &fileName);
bool load();
Path& BasePath;
Path& ScenPath;
Path& TempPath;
#define DEL_TEMP_ON_EXIT 1;
Path& logname;
bool intense;
} setts;
settings.cpp:
#include <windows.h>
#include "settings.h"
#include <stdio.h>
Setts::~Setts(){}
Path& Setts::getTempFileName(const Path &fileName)
{
GetCurrentDirectory(_MAX_PATH, path);
strcat(path, "\\");
strcat(path, fileName);
return path;
}
bool Setts::load()
{
TempPath = getTempFileName("scendata.tmp");
logname = getTempFileName("ats_cache.log");
return (result == ERROR_SUCCESS);
}
现在我收到了错误:near TempPath = getTempFileName("scendata.tmp");
和logname = getTempFileName("ats_cache.log");
:
'Setts :: getTempFileName':无法将参数1从'const char [13]'转换为'const Path(&amp;)' 原因:无法从'const char [13]'转换为'const Path' 没有可以进行此转换的上下文 错误C2664:'Setts :: getTempFileName':无法将参数1从'const char [14]'转换为'const Path(&amp;)' 原因:无法从'const char [14]'转换为'const Path' 没有可以进行此转换的上下文
答案 0 :(得分:3)
std::array
,std::string
,std::vector
和简单struct
。所有这些都很有用。
typedef std::string Path; // or
typedef std::array<char, MAX_PATH> Path; // or
typedef std::vector<char> Path;
Path GetTempFileName(const Path &path);
或简单地说:
struct Path
{
char value[MAX_PATH];
};
C ++ 11提供了using
作为typedef
的替代方案:
using Path = std::string; // or
using Path = std::array<char, MAX_PATH>; // or
using Path = std::vector<char>;
答案 1 :(得分:2)
我c ++你应该做得更好:
#include <array>
typedef std::array<char,260> Path;
Path MyTempFileName(const Path& fileName);
以下是您的代码的固定版本:
#include <array>
class Setts
{
public:
Setts();~Setts();
typedef std::array<char,_MAX_PATH> Path;
Path& MyTempFileName(Path fileName);
private:
Path path; //Path to INI
};
Setts::~Setts(){}
Setts::Path& Setts::MyTempFileName(Setts::Path fileName)
{
GetCurrentDirectory(_MAX_PATH, path.data());
strcat(path.data(), "\\");
strcat(path.data(), fileName);
return path;
}
但是我会说使用std::string
来保存数据,std::ostringstream
格式化它对于你的用例来说比固定大小的数组更好。
答案 2 :(得分:0)
通常在C中,您将为函数提供输出缓冲区以及它的大小。此外,假设fileName以零结尾,则无需指定缓冲区的大小。
char * GetTempFileName(const char *fileName, char *tempFileName, size_t tempFileNameSize);
该函数应返回tempFileName指针,如果发生错误则返回NULL。 然后你会把它称为:
char fileName[] = "myFile.txt";
char tempFileName[_MAX_PATH];
if (GetTempFileName(fileName, tempFileName, sizeof(tempFileName)) == NULL) {
// handle error
}
我还假设GetTempFileName的实现将使用fileName参数作为某种形式的模板。
答案 3 :(得分:0)
我已经解决了这个问题。感谢所有参与者。 (我已经删除了这个课程,仅仅是为了简化。
#define _MAX_PATH 260
char path [_MAX_PATH];
char BasePath [_MAX_PATH];
char ScenPath [_MAX_PATH];
char TempPath [_MAX_PATH];
char logname [_MAX_PATH];
char* getTempFileName(char *fileName, char *targetVariable);
char* getTempFileName(char *fileName, char *targetVariable)
{
GetCurrentDirectory(_MAX_PATH, targetVariable);
strcat_s(targetVariable, _MAX_PATH, "\\");
strcat_s(targetVariable, _MAX_PATH, fileName);
return targetVariable;
}
getTempFileName("scendata.tmp",TempPath);
getTempFileName("ats_cache.log",logname);