【问题标题】:Prototype for C function returning array of stringsC函数返回字符串数组的原型
【发布时间】:2013-04-26 14:35:02
【问题描述】:

所以,我正在尝试创建一个可读性很好的C 函数原型,它返回一个字符串数组(即char*)。我能想到的最接近的是:

const char * const *entrypoints()
{
    static const char* arrays[] = {"test123", "test2"};
    return arrays;
}

但是,我不喜欢声明中的两个*s,它看起来很吓人:) ...但是我没有找到一种方法来强调该函数正在返回一个字符串数组这一事实。 . 在函数声明中使用 [] 会导致有趣的编译错误(例如,声明为函数的“入口点”返回 const char* (entrypoints() []) 的数组或在 const char[]* entrypoints()const char*[] entrypoints() 的“[”标记之前的预期 unqualified-id .. . 是的,编译器在这两种情况下都是正确的),谷歌似乎对此没有答案......所以我在这里。

有没有办法以一种易于阅读的方式声明一个函数原型(这将在公共 API 中使用),它将返回一个 C 字符串数组。不是 C++。 C。普通的老C。如果没有,我将不得不坚持两星方法......即。 char **。并不是说这很尴尬,但我想强调该函数返回一个字符串数组。 C 喜欢字符串 :)

【问题讨论】:

  • C 中不能返回数组类型(“函数声明器不能指定返回类型是函数类型还是数组类型”),所以肯定是双星时间。
  • 你希望调用者如何知道数组中有多少个字符串?你需要一个哨兵,或者一个伯爵。
  • @unwind 好问题!我想我得考虑一下了……哨兵感觉更友好:)
  • @unwind 你可以返回pointer to array of N pointers to const char

标签: c arrays string return prototype


【解决方案1】:

我不喜欢声明中的两个*s

我为你感到难过,但这就是你声明“指针数组”返回类型的方式。数组衰减为指向其第一个元素的指针,因此此声明是完成所需操作的唯一方法。

您可以做的是返回一个指向字符串数组的指针

const char *(*fn())[2]
{
    static const char *arr[2] = {
        "foo",
        "bar"
    };
    return &arr;
}

【讨论】:

  • 你能详细说明 static 关键字在这里提供什么功能吗?我只知道如果在变量之前使用它会在函数调用之间保持变量的值。它在这里做什么?如果不是麻烦,告诉我const 限定符在这里的作用。
  • 问题是我真的不知道数组有多少元素,正如上面@unwind 指出的那样,我需要一个标记元素,指示最后一个元素。
  • @Rüppell'sVulture static 避免使用 UB(如果数组是自动的而不是静态的,则无法返回它)。 const 用于指定字符串的字符是只读的(因为我们这里有字符串 literals。)
  • @fritzone 那你这次得当二星程序员了,对不起。
  • @H2CO3 ;-) 顺便说一句,你是一种酸,当与雨水混合时会破坏历史古迹。
猜你喜欢
  • 2013-03-25
  • 2011-11-23
  • 2013-11-22
  • 1970-01-01
  • 1970-01-01
  • 2013-10-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-06
相关资源
最近更新 更多