在函数定义中提供默认参数值

时间:2018-01-30 05:46:25

标签: c function-definition

这是我收到错误的地方,也是主要的,它给了我一个隐含声明这个碰撞函数的警告。不知道为什么。编辑:我刚刚得知C不能有默认参数。有没有解决的办法?

void bump(char*s, char c = 'o')
 {
   s.push_back(c);
 }

int main()
{
 char *s = "foo";
 printf("%s\n",s);

 bump(&s, '\0'); 
 printf("%s\n",s);

 bump(&s, 'x');
 printf("%s\n",s);

 return 0;
}

2 个答案:

答案 0 :(得分:1)

首先,C中没有默认参数。引用C11,章节§6.9.1/ P6,函数定义强调我的

  

如果声明者包含标识符列表,则声明列表中的每个声明都应该   至少有一个声明者,那些声明者只能声明来自的标识符   标识符列表,并且应声明标识符列表中的每个标识符。标识符   声明为typedef名称不得重新声明为参数。 中的声明   声明列表不应包含寄存器和否的存储类说明符   初始化。

因此,您的函数定义是语法错误。编译器抱怨同样的事情。

那就是说,在bump()函数调用中,

  • 看起来您需要传递char *,而不是char **(检查数据类型)
  • 尝试的操作是修改字符串文字。即使您更正了第一个问题,您也基本上会调用undefined behavior。你需要传递一个可修改的内存,比如一个数组。

答案 1 :(得分:0)

  

我刚学会了C不能有默认参数。有没有解决的办法?

不是真的。见Sourav Gosh's answer(提供有用的建议)。您可以做的是定义不同的功能(使用另一个,唯一,名称),例如

void bump_o(char*s) { bump(s, 'o'); }

你甚至可以在某个头文件中将该函数定义为static inline

您也可以使用宏:

#define BUMP_O(S) bump((S), 'o')

但这通常是味道不佳。

请注意, C和C ++是不同的语言。您向我们展示的代码不正确C(请参阅n1570)。

我建议使用所有警告和调试信息(例如gcc -Wall -Wextra -gGCC)编译代码,并使用调试器(例如gdb