C имя функции или указатель функции?

Посмотрите на этот код:

#include <stdio.h>

typedef int (*callback) (void *arg);
callback world = NULL;

int f(void *_) {
    printf("World!");
    return 0;
}

int main() {
    printf("Hello, ");
    // world = f;
    world = &f; // both works
    if (world != NULL) {
        world(NULL);
    }
}

При настройке переменной world оба world = f; и world = &f; работает.

Что я должен использовать? Это зависит от компилятора или версии C?

% gcc -v
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 8.0.0 (clang-800.0.38)
Target: x86_64-apple-darwin15.6.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
+6
источник поделиться
2 ответа

Оба world = f; и world = &f; работают, потому что нет никакой разницы между f и &f при передаче в качестве аргумента.

См. C99 (раздел 6.7.5.3.8).

Объявление параметра как возвращаемого типа функции 'должно быть отрегулировано на' 'указатель на возвращаемый тип функции, как в 6.3.2.1.

+2
источник

Ваша функция f имеет тип int (void *_). Всякий раз, когда <<20 > используется в выражении, он неявно преобразуется в указатель на себя, который имеет тип int(*) (void *_).

Что я должен использовать?

Таким образом, для всех практических целей имя функции f и указатель на ту же функцию &f взаимозаменяемы. Также посмотрите Почему все эти определения указателей функций все работают?

Это зависит от компилятора или версии C?

Не зависит от любого компилятора или версии C.

+1
источник

Посмотрите другие вопросы по меткам или Задайте вопрос