Можно ли предотвратить макрос от скрытия функции? - PullRequest
0 голосов
/ 02 марта 2020

По старым причинам у меня есть макрос; назовите это #define foo. Теперь foo - это макрос не функционального типа. Мне нужно, чтобы foo расширился до нуля или чего-то, что может игнорироваться компилятором (например, атрибутом), когда оно предшествует вызову функции.

Однако я обнаружил, что теперь мне также нужно создать функция с именем foo.

Препроцессор обрабатывает макросы в стиле функции иначе, чем не-макросы, что подразумевает, что может быть способом заставить его преобразовать foo(...) иначе, чем скажем, foo .... Однако я не могу просто дать другое определение для foo как макроса функции.

Можно ли как-нибудь решить эту проблему?

ps "Не делайте этого во-первых "не полезно. Макрос foo уже существует; не выполнимо , чтобы изменить это, ни недавно введенная функция (которая находится вне моего контроля). Пожалуйста, ограничьте дискуссию ответом на вопрос в виде вопроса .


Пример:

#define /* ... magic here ... */

  // void foo(int x, int y); <-- might be in a module

  void bar()
  {
    // First 'foo' has no effect
    // Second 'foo' calls the function 'foo'
    foo foo(42, 7);
  }

Ответы [ 4 ]

4 голосов
/ 02 марта 2020

Нет, невозможно иметь имя в контексте быть макросом. Либо это какой-то #define, либо это не так.

Это основная причина, по которой следует избегать макросов или иметь SHOUTY имен.

1 голос
/ 02 марта 2020

Перед тем, как макрос объявит функцию foo и определит функцию goo

void foo();
inline void goo(){
    foo();
}
#define foo

Вы можете вызвать функцию goo, которая будет встроена после расширения макроса.

foo goo();

В нижней части файл определите foo или объявите как extern вверху и поместите в другой файл.

#undef foo
void foo(){
}
0 голосов
/ 02 марта 2020

Вы можете предотвратить расширение только макроса , подобного функции *1002*. Например:

#include <iostream>

int foo() { return 2; }

#define foo() 1

int main() {
    std::cout << foo() << '\n';   // Outputs 1.
    std::cout << (foo)() << '\n'; // Outputs 2.
}
0 голосов
/ 02 марта 2020

Единственный способ сделать это - определить foo и foo (...). Но тогда вы получите:

foo.cc:2:0: warning: "foo" redefined

Вы не можете определить оба.

Вы должны назвать функцию как-то иначе.

...