当编写一个返回字符串部分的函数时,让它在返回值中使用参数的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
?
注意,当然它总是可以返回一个偏移而不是字符串作为一种解决方法。
答案 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。