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

Posted

技术标签:

【中文标题】如何为函数(C++)声明字符序列?【英文标题】:How to declare char sequence for function (C++)? 【发布时间】:2013-10-27 09:33:57 【问题描述】:

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

我现在有这个:

#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 的 cmets

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 (&)' 原因:无法从 'const char [13]' 转换为 'const Path' 没有可以进行这种转换的上下文 错误 C2664:“Setts::getTempFileName”:无法将参数 1 从“const char [14]”转换为“const Path (&)” 原因:无法从 'const char [14]' 转换为 'const Path' 没有可以进行这种转换的上下文

【问题讨论】:

我要先说,嗯?那应该是 call 还是 declaration ?? 由于您已将 Path 的 typedef 放置在 Setts 类中,因此您需要在其前面加上类名以供使用:Setts::Path 您还应该在内部为path 成员使用Path 类型。 好的,我发现了错误。我必须将 typedef 从类外移动。并将其放在#include 之后。但现在我有下一个错误:错误 C2664: 'GetCurrentDirectoryA' : cannot convert parameter 2 from 'Path' to 'LPSTR' 为您的函数使用不同的名称GetTempFileName Stupit windows 为它定义了一个宏扩展为GetTempFileNameA 【参考方案1】:

std::arraystd::stringstd::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>;

【讨论】:

也许我无法在 google 中搜索,但我找不到 std 类的 msdn 页面。我不清楚如何在项目中包含 std::array 。 + 我收到错误 C2873: 'Path' : symbol cannot be used in a using-declaration + 我现在无法访问 msdn.microsoft.com/en-US 页面。奇怪... using identifier = type_name 语法需要 C++11 我认为...不是吗? @dreamlax:是的。它是 C++11 对 typedef 的替代品。 我在 Visual Studio Express 2010 中编译(idk 是 C++ 版本) 如果您的编译器不支持 C++11,您可以使用其他建议,例如 stringvectorstruct。也使用typedef 而不是using【参考方案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 来格式化它对于您的用例来说是比固定大小的数组更好的解决方案。

【讨论】:

typedef std::array&lt;char,MAX_PATH&gt; Path; 但是当我只想定义一种类型时,我真的需要包含类数组的所有方法吗? 抱歉,我仍然无法使其正常工作。我应该使用哪个标签来将代码粘贴到此处? [CODE]test..wait[/CODE] CODEtest..wait/CODE test..wait 我想测试代码,但不知道如何... 简单地缩进四个空格,并在之前的纯文本中留下至少一个空行(编辑器中也有一个帮助按钮) path.data() 是什么意思...数据看起来像一些函数,这是做什么的?函数结果保存到路径变量后是否求值?【参考方案3】:

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

【讨论】:

【参考方案4】:

我已经解决了这个问题。感谢所有相关人员。 (为了简单起见,我删除了这个类。

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

【讨论】:

以上是关于如何为函数(C++)声明字符序列?的主要内容,如果未能解决你的问题,请参考以下文章

如何为每个循环发出不同的元组并在风暴螺栓的单个字段方法中声明?

C++中的string详解

在 C++ 中方便地声明编译时字符串

如何为 extern 的新声明解决多个先前声明?

C++:声明一个在头文件中返回字符串的函数?

如何为闭包参数声明生命周期?