Цитата(jcxz @ May 10 2017, 13:28)

Имеется функция:
char *StrFunc(char const *str) {}
Внутри она использует str именно как char const * (только чтение) и потом возвращает например: str+N (N - типа int).
Вариант

:
Код
#define func(str) ((str)+N)
Это была больше шутка, впрочем иногда вполне годная

.
Самое близкое к описанному Вами поведение даст
_Generic (стандарт С1х), как-то так:
Код
#define StrFunc(str) _Generic((str), const char*: (const char*)__StrFunc(str), char*: __StrFunc(str))
Т.е. Вашу функцию делаете в виде char* __StrFunc(const char* str), а потом везде вызываете макрос StrFunc. Поведение будет точно такое, как Вы писали:
Цитата
Но хочется, чтобы и возвращаемое значение было того же типа, что и передано: для char * - char *, для char const * - char const *.
Чтобы не было необходимости делать: char const *s; ... ; s = (char const *)StrFunc(s);
Еще можно сделать макросы с использованием typeof или __auto_type (расширения GCC).