C++ 将字符串的二维数组传递给函数
我可以使用以下命令初始化二维字符串数组:C++ 将字符串的二维数组传递给函数,c++,c++17,C++,C++17,我可以使用以下命令初始化二维字符串数组: const char*const aListOfStrings[]{“test”,“test1”} 但是,如果我想在调用函数时执行相同的操作,例如: void function( char const * const aListOfStrings[] ) {} void CallWithArrayOfStrings() { function( {"test", "test1"} ); } 编译器礼貌地拒
const char*const aListOfStrings[]{“test”,“test1”}代码>
但是,如果我想在调用函数时执行相同的操作,例如:
void function( char const * const aListOfStrings[] ) {}
void CallWithArrayOfStrings()
{
function( {"test", "test1"} );
}
编译器礼貌地拒绝,并出现以下错误:
error: cannot convert '<brace-enclosed initializer list>' to 'char**'
我似乎理解当数组是变量时如何初始化数组,但显然我不理解它在调用函数的上下文中是如何工作的。我一直认为初始化变量与初始化函数参数是一样的?我一辈子都在撒谎吗?;)
多谢各位
UPATE:已删除C标记。C数组在大括号初始值设定项之前需要一个“=”号,错误则不同。看起来问题很相似,但是。。。
还修复了结束引号。这是因为编译器没有猜测传递给函数的内联参数的类型,因此必须在之前明确声明它,例如:
const char* data[] = { "test", "test1" };
function(data);
< >但是C++有<代码>:代码:>代码> STD::InIALIZELSYList,<代码> STD::vector < /代码>,没有任何理由使用一个指针来指向<代码> char < /> >,除非你有特定的要求。 < P>这是因为你的编译器不是猜测你的内联参数的类型,传递给<代码>函数>因此,您必须在之前明确声明,例如:
const char* data[] = { "test", "test1" };
function(data);
< C++ >代码< >代码:>代码> STD::InIaliSeleSerixList代码> STD::向量< /代码>,没有特殊的要求,除非有特定的要求,否则不必使用一组指针。< < /P> <代码> const char * const alistoFordSc[] {“test”,“test 1”};code>是
const char*const aListOfStrings[2]{“test”,“test1”}代码>
推导出尺寸
但签名的参数是固定的(除非使用模板),而且不能按值传递C-array,因此:
void函数(char const*const aListOfStrings[])
等效于
void函数(char const*const*alistofstring)
要使用语法,可以使用(奇怪的)语法
或模板版本
template <std::size_t N>
void function(char const * const (&aListOfStrings)[N]);
模板
空函数(字符常量*常量(&alistofstring)[N]);
const char*const aListOfStrings[]{“test”,“test1”}
是
const char*const aListOfStrings[2]{“test”,“test1”}代码>
推导出尺寸
但签名的参数是固定的(除非使用模板),而且不能按值传递C-array,因此:
void函数(char const*const aListOfStrings[])
等效于
void函数(char const*const*alistofstring)
要使用语法,可以使用(奇怪的)语法
或模板版本
template <std::size_t N>
void function(char const * const (&aListOfStrings)[N]);
模板
空函数(字符常量*常量(&alistofstring)[N]);
const-char*const-aListOfStrings[]{“test”,“test1};
您在结尾处遗漏了双引号。const-char*const-aListOfStrings[]{“test”,“test1}代码>您在结尾处遗漏了双引号。我确实有一个特定的要求。使用容器不是此特定实例的选项。有没有可能用某种方式来表达呢?刚才回答了我自己的问题:function2((char-const*const[]){“test”,“test2”});这个把戏做得很好。我确实有一个特别的要求。使用容器不是此特定实例的选项。有没有可能用某种方式来表达呢?刚才回答了我自己的问题:function2((char-const*const[]){“test”,“test2”});非常好。谢谢你花时间回答这个问题,但是我需要保留尺寸扣减。铸造工程(见我的评论上面)。模板版本允许扣除(见链接演示)。对于您的铸造,您没有尺寸信息…这是有道理的。我没有仔细考虑过…aListOfStrings[]作为参数在编译时不知道它有多大,唯一的方法是使用模板。谢谢@jarod42谢谢你花时间回答这个问题,但是我需要保留尺寸扣减。铸造工程(见我的评论上面)。模板版本允许扣除(见链接演示)。对于您的铸造,您没有尺寸信息…这是有道理的。我没有仔细考虑过…aListOfStrings[]作为参数在编译时不知道它有多大,唯一的方法是使用模板。谢谢@Jarod42