2016-10-01 12 views
6

चलो इस कोड को देखें:सी फ़ंक्शन नाम या फ़ंक्शन पॉइंटर?

#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; काम करता है।

मुझे किस का उपयोग करना चाहिए? क्या यह कंपाइलर या सी संस्करण पर निर्भर करता है?

% 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 
+4

http://stackoverflow.com/questions/6293403/in-c-what-is-the-difference-between-function-and-function-when-passed-as-a – Pavel

+0

http: // stackoverflow .com/प्रश्न/3674200/क्या-क्या एक typedef-साथ-कोष्ठक की तरह-typedef-पूर्णांक-fvoid-मतलब है यह एक –

उत्तर

2

world = f; और world = &f; दोनों काम करता है क्योंकि f और &f के बीच कोई तर्क नहीं होने पर कोई अंतर नहीं है।

C99 विनिर्देश (अनुभाग 6.7.5.3.8) देखें।

"फ़ंक्शन रिटर्निंग प्रकार" के रूप में पैरामीटर की घोषणा को 'फ़ंक्शन रिटर्निंग प्रकार के सूचक' में समायोजित किया जाएगा, जैसा कि 6.3.2.1 में है।

1

आपका समारोह f प्रकार int (void *_) की है। जब भी f किसी अभिव्यक्ति में उपयोग किया जाता है, तो यह निश्चित रूप से एक सूचक में परिवर्तित हो जाता है, जो int(*) (void *_) प्रकार का होता है।

मुझे किस का उपयोग करना चाहिए?

तो, सभी व्यावहारिक प्रयोजनों के लिए, एक समारोह f के नाम और एक ही समारोह &f के सूचक के परस्पर विनिमय कर रहे। "Why do all these function pointer definitions all work? "

पर यह एक नज़र डालें क्या यह कंपाइलर या सी संस्करण पर निर्भर करता है?

किसी भी कंपाइलर या सी संस्करण पर निर्भर नहीं है।

संबंधित मुद्दे