我看到有人的C ++代码有如下的函数声明:
void information_log( const char* fmt , ...)
或像
一样捕获块catch(...)
{
}
“......”是什么意思?
答案 0 :(得分:8)
函数原型中的省略号...
用于将函数表示为可变参数。也就是说,它允许将可变数量的参数传递给函数。在这种形式中,函数必须为用户定义一些方法,以准确指定它们呈现的参数数量,因为C ++中的可变参数库函数无法动态地确定此信息。
例如,stdio函数printf
就是原型的一个这样的函数:
int printf(const char *format, ...);
据推测,根据两个原型之间的相似性,您描述的information_log
函数旨在反映printf
的大部分功能,甚至可能在内部使用printf
,或者其中一个它的堂兄弟。
以下是如何实现可变参数函数的示例:
// cstdarg provides access to the arguments passed to the ellipsis
#include <cstdarg> // or (#include <stdarg.h>)
#include <cstdio>
#include <cstring>
// Concatenates as many strings as are present
void concatenate(char ** out, int num_str, ...)
{
// Store where the arguments are in memory
va_list args;
// Find the first variadic argument, relative to the last named argument
va_start(args, num_str);
int out_len = 0;
int * lengths = new int[num_str];
char ** strings = new char*[num_str];
// Extract the strings from the variadic argument list
for(int i = 0; i < num_str; i++)
{
// Specify the position in the argument list and the type
// Note: You must know the type, stdarg can't detect it for you
strings[i] = va_arg(args, char *);
lengths[i] = strlen(strings[i]);
out_len += lengths[i];
}
// Concatenate the strings
int dest_cursor = 0;
(*out) = new char[out_len + 1];
for(int i = 0; i < num_str; i++)
{
strncpy( (*out) + dest_cursor, strings[i], lengths[i]);
dest_cursor += lengths[i];
}
(*out)[dest_cursor] = '\0';
// Clean up
delete [] strings;
delete [] lengths;
va_end(args);
}
int main()
{
char * output = NULL;
// Call our function and print the result
concatenate(&output, 5, "The ", "quick", " brown ", "fox ", "jumps!\n");
printf("%s", output);
delete [] output;
return 0;
}
答案 1 :(得分:7)
这里真的是两个单独的问题,只是使用相同的符号。 : - )
原型只是表示可变数量的参数。我真正可以说的是,如果你碰巧知道这一点,它有点像C printf
函数。该函数只是在需要时继续引入参数。
catch (...)
代码只是意味着,捕获任何异常。 (通常你会把它放在一些特定的catch块之后,这样就可以作为“全能”了。)
答案 2 :(得分:3)
对于捕获物,它意味着捕获任何东西。因此抛出的所有异常都将进入此catch块。
对于参数列表,它意味着存在可变数量的参数。您必须使用stdarg.h API来解析它们。
答案 3 :(得分:3)
$ 5.2.2 / 6 - “可以声明一个函数 接受较少的论点(通过 声明默认参数(8.3.6)) 或更多的论点(通过使用 省略号,... 8.3.5)比数字 功能中的参数 定义(8.4)。 [注意:这意味着 那,除了省略号(...) 使用,参数可用 每个论点。]“
很好地总结了OP中“information_log”声明的解释
$ 15.3 / 6 - “A ...在一个处理程序中 异常声明函数 类似于...在一个函数中 参数声明;它指定了一个 匹配任何异常。如果存在,a ... handler应该是最后一个处理程序 对于它的尝试块。“
虽然不是标准术语,但它通常被称为catch all子句或catch all handler。
void f(){
try{
throw 2.2; // throw double
}
catch(int){} // standard conversion from double to int not permitted
catch(...){
cout << "catch it here"; // is caught here in catch all clause
}
}
int main(){
f();
}
答案 4 :(得分:2)
省略号表示法表示变量参数列表。
http://publications.gbdirect.co.uk/c_book/chapter9/stdarg.html
http://msdn.microsoft.com/en-us/library/fxhdxye9(VS.80).aspx
答案 5 :(得分:1)
请参阅Functions with an Unspecified Number of Parameters
使用省略号,...,用C ++ 函数原型, 意味着 函数可以用 未知数量和参数类型 。 此功能可用于抑制 参数类型检查和允许 界面的灵活性 功能。 C ++允许函数 用未指定数量的声明声明 参数。