【问题标题】:Providing default argument value in function definition在函数定义中提供默认参数值
【发布时间】:2018-07-08 22:32:39
【问题描述】:

这是我得到错误的地方,也是主要的,它给了我一个关于这个凹凸函数的隐式声明的警告。也不知道为什么。编辑:我刚刚了解到 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;
}

【问题讨论】:

  • C 中的函数没有默认参数。另外,您对s.push_back(c); 有什么期望?
  • 也没有push_back for char*
  • 你的函数签名不应该有默认值,应该是void bump(char *s, char c)。另外,您希望如何从 char 指针调用 push_back() 函数?
  • push_back() in C??这在我看来更像C++printf() 除外)!
  • 你的C++书要还,对学C不好。

标签: c function-definition


【解决方案1】:

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

如果声明符包含标识符列表,则声明列表中的每个声明应 至少有一个声明符,这些声明符应仅声明来自 标识符列表,并且应声明标识符列表中的每个标识符。标识符 声明为 typedef 名称不应重新声明为参数。 中的声明 声明列表应不包含除寄存器以外的存储类说明符,并且不包含 初始化。

所以,你的函数定义是一个语法错误。编译器也在抱怨同样的问题。

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

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

【讨论】:

    【解决方案2】:

    我刚刚了解到 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-26
      • 1970-01-01
      • 1970-01-01
      • 2014-02-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-26
      • 1970-01-01
      相关资源
      最近更新 更多