C++ 如何为函数(C+;+;)声明字符序列?

C++ 如何为函数(C+;+;)声明字符序列?,c++,C++,如何声明函数在结果中具有字符序列 我现在有: #define _MAX_PATH 260 char * GetTempFileName(char fileName [_MAX_PATH]); 但是结果应该是char[\u MAX\u PATH]类型 真的不可能在char序列char[\u MAX\u PATH]中获得结果吗?这里的问题是,当我创建新类型Path时,所有依赖于char[\u MAX\u Path]类型的条件函数都会在项目中导致错误 来自g-makulik的评论

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

我现在有:

#define _MAX_PATH   260    
char * GetTempFileName(char fileName [_MAX_PATH]);
但是结果应该是char[\u MAX\u PATH]类型



真的不可能在char序列char[\u MAX\u PATH]中获得结果吗?这里的问题是,当我创建新类型Path时,所有依赖于char[\u MAX\u Path]类型的条件函数都会在项目中导致错误


来自g-makulik的评论

path.data()是什么意思。。。数据看起来像某种函数,什么 这样行吗?是否在函数结果确定后进行评估 是否保存到路径变量?–用户1141649 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.h:
#包括
#包括
#包括
typedef char Path[_MAX_Path];
外部类集合
{
路径&路径;
公众:
Setts();~Setts();
路径和getTempFileName(常量路径和文件名);
bool-load();
路径与基本路径;
路径&scenepath;
路径&临时路径;
#在出口1上定义DEL_TEMP_;
路径和日志名;
布尔激烈;
}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);
}
#包括
#包括“settings.h”
#包括
Setts::~Setts(){}
路径和集合::getTempFileName(常量路径和文件名)
{
GetCurrentDirectory(_MAX_PATH,PATH);
strcat(路径“\\”;
strcat(路径、文件名);
返回路径;
}
bool Setts::load()
{
TempPath=getTempFileName(“scendata.tmp”);
logname=getTempFileName(“ats_cache.log”);
返回(结果==错误\成功);
}
现在我得到了错误:
near-TempPath=getTempFileName(“scendata.tmp”)
logname=getTempFileName(“ats_cache.log”)

'Setts::getTempFileName':无法将参数1从'const char[13]'转换为'const Path(&)' 原因:无法从“常量字符[13]”转换为“常量路径” 没有可以进行此转换的上下文 错误C2664:'Setts::getTempFileName':无法将参数1从'const char[14]'转换为'const Path(&)' 原因:无法从“常量字符[14]”转换为“常量路径” 没有可以进行这种转换的上下文,也没有简单的结构。所有这些都是有用的

typedef std::string                Path;  // or
typedef std::array<char, MAX_PATH> Path;  // or
typedef std::vector<char>          Path;

Path GetTempFileName(const Path &path);

C++11使用
作为typedef的一种替代方案来呈现:

using Path = std::string;                 // or
using Path = std::array<char, MAX_PATH>;  // or
using Path = std::vector<char>;
使用Path=std::string;//或
使用Path=std::array;//或
使用Path=std::vector;
,以及一个简单的
结构。所有这些都是有用的

typedef std::string                Path;  // or
typedef std::array<char, MAX_PATH> Path;  // or
typedef std::vector<char>          Path;

Path GetTempFileName(const Path &path);

C++11使用
作为typedef的一种替代方案来呈现:

using Path = std::string;                 // or
using Path = std::array<char, MAX_PATH>;  // or
using Path = std::vector<char>;
使用Path=std::string;//或
使用Path=std::array;//或
使用Path=std::vector;

iC++:你最好做:

#include <array>

typedef std::array<char,260> Path;

Path MyTempFileName(const Path& fileName);
#包括
typedef std::数组路径;
路径MyTempFileName(常量路径和文件名);

以下是您的代码的固定版本:

#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;
}
#包括
类集合
{
公众:
Setts();~Setts();
typedef std::数组路径;
Path&MyTempFileName(路径文件名);
私人:
Path Path;//INI的路径
};
Setts::~Setts(){}
Setts::Path&Setts::MyTempFileName(Setts::Path fileName)
{
GetCurrentDirectory(_MAX_PATH,PATH.data());
strcat(path.data(),“\\”;
strcat(path.data(),文件名);
返回路径;
}

但是,我想用<代码> STD::String 保存数据,而<代码> STD::OSTRIGSWATHOR/DECOME格式比固定大小数组更适合您的用例。

I+C++,您最好做:

#include <array>

typedef std::array<char,260> Path;

Path MyTempFileName(const Path& fileName);
#包括
typedef std::数组路径;
路径MyTempFileName(常量路径和文件名);

以下是您的代码的固定版本:

#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;
}
#包括
类集合
{
公众:
Setts();~Setts();
typedef std::数组路径;
Path&MyTempFileName(路径文件名);
私人:
Path Path;//INI的路径
};
Setts::~Setts(){}
Setts::Path&Setts::MyTempFileName(Setts::Path fileName)
{
GetCurrentDirectory(_MAX_PATH,PATH.data());
strcat(path.data(),“\\”;
strcat(path.data(),文件名);
返回路径;
}

但是我想说,使用
std::string
来保存数据,使用
std::ostringstream
来格式化数据,对于您的用例来说,这将是比固定大小数组更好的解决方案。

通常在C语言中,您将为函数提供输出缓冲区以及它的大小。另外,假设文件名以零结尾,则无需指定缓冲区的大小

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参数作为某种形式的模板。

通常在C中,您将为函数提供输出缓冲区以及它的大小。另外,假设文件名以零结尾,则无需指定缓冲区的大小

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参数作为某种形式的模板。

我已经解决了这个问题。感谢所有参与的人。(为了简化起见,我删除了这个类

#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);

我已经解决了这个问题。感谢所有的参与。(我删除了这个类只是为了简化这里。)

#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);

我先说,嗯?这应该是一个调用还是一个声明?既然你已经将
Path
的typedef放在class
Setts
中,你需要在它前面加上classname以供使用:
Setts::Path
你也应该在
Path
中使用
Path
类型>member.OK,我发现了错误。我必须将typedef从类外部移动。并将其放在#include之后。但现在我出现了下一个错误:错误C2664:“GetCurrentDirectoryA”:无法将参数2从“Path”转换为“LPSTR”,请使用其他