这是我收到错误的地方,也是主要的,它给了我一个隐含声明这个碰撞函数的警告。不知道为什么。编辑:我刚刚得知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;
}
答案 0 :(得分:1)
首先,C中没有默认参数。引用C11
,章节§6.9.1/ P6,函数定义(强调我的)
如果声明者包含标识符列表,则声明列表中的每个声明都应该 至少有一个声明者,那些声明者只能声明来自的标识符 标识符列表,并且应声明标识符列表中的每个标识符。标识符 声明为typedef名称不得重新声明为参数。 中的声明 声明列表不应包含寄存器和否的存储类说明符 初始化。强>
因此,您的函数定义是语法错误。编译器抱怨同样的事情。
那就是说,在bump()
函数调用中,
char *
,而不是char **
(检查数据类型)答案 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 -g
和GCC)编译代码,并使用调试器(例如gdb
)