是否有一种可移植的方法来使用函数使用参数' const'用于返回值?

时间:2016-05-03 06:51:40

标签: c const c11

当编写一个返回字符串部分的函数时,让它在返回值中使用参数的const值可能很有用。

在使用C ++和strstr的gnu-libc中取__asm例如:

extern "C++"
{
extern char *strrchr (char *__s, int __c)
     __THROW __asm ("strrchr") __attribute_pure__ __nonnull ((1));
extern const char *strrchr (const char *__s, int __c)
     __THROW __asm ("strrchr") __attribute_pure__ __nonnull ((1));
....

C中是否有一种可移植的方法可以使用参数的const值来定义返回值的const

注意,当然它总是可以返回一个偏移而不是字符串作为一种解决方法。

1 个答案:

答案 0 :(得分:3)

有可能用邪恶的宏观技巧。我甚至不会考虑那个。唯一的好解决方案需要C11,你有?- set_prolog_flag(color_term, false).,它可以感知编译时使用的类型。

一些无意义的代码示例:

_Generic

输出:

#include <stdio.h>

#define strrchr(s,c)                      \
  _Generic((s),                           \
            char*: strrchr_s,             \
            const char*: strrchr_cs) (s,c)

char *strrchr_s (char *__s, int __c)
{
  printf ("Not constant: %s\n", __s);
  __s[1] = 'a';
  return __s;
}

const char *strrchr_cs (const char *__s, int __c)
{
  printf ("Constant: %s\n", __s);
  return __s;
}


int main (void) 
{
  char str[] = "Hello";

  (void)strrchr(str, 0);
  (void)strrchr((const char*)str, 0);

  return 0;
}

这是100%标准和便携式,假设支持C11。