0

如何声明函数在结果中具有字符序列?

我现在有这个:

#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() ... data 看起来像某个函数是什么意思,这是做什么的?是否在函数结果保存到路径变量后进行评估?– user1141649 16 分钟前

g-马库利克:

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;

设置.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 (&)' 原因:无法从 'const char [13]' 转换为 'const Path' 没有上下文这种转换是可能的 错误 C2664: 'Setts::getTempFileName' : cannot convert parameter 1 from 'const char [14]' to 'const Path (&)' 原因: cannot convert from 'const char [14]' to 'const Path ' 没有可以进行这种转换的上下文

4

4 回答 4

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++11using作为 的替代方案typedef

using Path = std::string;                 // or
using Path = std::array<char, MAX_PATH>;  // or
using Path = std::vector<char>;
于 2013-10-27T09:39:35.200 回答
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对其进行格式化比固定大小的数组更适合您的用例。

于 2013-10-27T09:39:44.513 回答
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);
于 2013-10-30T10:25:39.813 回答
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 参数作为某种形式的模板。

于 2013-10-27T09:43:02.460 回答