Следующий код не может быть скомпилирован VC++ и clang.
int f()
{
return 0;
}
int main()
{
// error : called object type 'int' is not a function or function pointer
int f = f();
}
Это необходимо в некоторых случаях. Например, у меня есть функция для вычисления количества символов строки, которая называется count
, однако другой параметр функции также выразительно называется count
.
size_t count(char* sz)
{
return strlen(sz);
}
bool check_count(char* sz, size_t count)
{
return count == count(sz); // ???
}
Как решить эту проблему?
Ответ прост. Это не поддерживается. C, как и многие другие языки, не может поддерживать абсолютно любой сценарий. Нецелесообразно выдвигать такую цель. Никто никогда не пытался этого добиться.
В вашем конкретном случае вы должны переименовать свой параметр. Функция всегда имеет ограниченный объем. Он всегда перекомпилируется в целом. Имена параметров в прототипах в файлах заголовков могут иметь разные имена. Переименование параметра в теле функции будет работать в 99,9999% случаев.
В C++ вы можете определить пространство имен для своих объектов, в вашем примере вы могли бы сделать:
namespace MyFunctions {
int f()
{
return 0;
}
}
int main()
{
int f = MyFunctions::f();
}
::f()
, но на самом деле не делайте этого.