2016-04-07 7 views
0

次のコマンドラインプログラムの名前をmain.mから​​main.mmに変更すると、奇妙なコードエラーが発生します。 main.mとしてうまく動作します。誰でも知っている理由は?なぜこの目的のC/C++コードmain.mmではなくmain.mが必要ですか?

https://stackoverflow.com/a/36469891/105539

SOURCE

#import <Foundation/Foundation.h> 

void detectNewFile (
    ConstFSEventStreamRef streamRef, 
    void *clientCallBackInfo, 
    size_t numEvents, 
    void *eventPaths, 
    const FSEventStreamEventFlags eventFlags[], 
    const FSEventStreamEventId eventIds[]) 
{ 
    int i; 
    char **paths = eventPaths; 

    printf("GOT AN EVENT!!!!\n"); 
    for (i=0; i<numEvents; i++) { 
     printf("Change %llu in %s, flags %u\n", eventIds[i], paths[i], (unsigned int)eventFlags[i]); 
    } 
} 

int main(int argc, const char * argv[]) { 
    @autoreleasepool { 

     short nPathCount = 2; 
     CFStringRef mypath[nPathCount]; 
     mypath[0] = CFSTR("/Users/mike/Documents"); 
     mypath[1] = CFSTR("/Users/mike/Downloads"); 
     CFArrayRef pathsToWatch = CFArrayCreate(NULL, (const void **)&mypath, nPathCount, NULL); 
     void *callbackInfo = NULL; 
     CFAbsoluteTime latency = 1.0; // seconds 

     FSEventStreamRef hStream = FSEventStreamCreate(NULL, 
      &detectNewFile, 
      callbackInfo, 
      pathsToWatch, 
      kFSEventStreamEventIdSinceNow, 
      latency, 
      kFSEventStreamCreateFlagFileEvents 
     ); 

     FSEventStreamScheduleWithRunLoop(hStream, CFRunLoopGetCurrent(),   kCFRunLoopDefaultMode); 
     FSEventStreamStart(hStream); 
     printf("Waiting on new file creations...\n"); 
     CFRunLoopRun(); // runs in an endless loop, only letting the callback function run 

    } // end autorelease pool 
    return 0; 
} 

エラー@johnelemansへ

FOR: 
     char **paths = eventPaths; 

Cannot initialize a variable of type 'char **' with an lvalue of type 'void *' 

FOR: 
     FSEventStreamRef hStream = FSEventStreamCreate(NULL, 
      &detectNewFile, 
      callbackInfo, 
      pathsToWatch, 
      kFSEventStreamEventIdSinceNow, 
      latency, 
      kFSEventStreamCreateFlagFileEvents 
     ); 

No matching function for call to 'FSEventStreamCreate' 
+0

関連するコードと表示されているエラーで質問を更新してください。 – rmaddy

+0

@rmaddyさて、私はそれをやった。 – Volomike

+1

char ** paths = eventPathsです。 (evenPathsが無効な場合)はCでは有効ですが、C++では有効ではありません。 –

答えて

1

おかげで、私は問題を発見しました。 Cでは、自動鋳造をvoid *からchar **にするのは合法ですが、C++ではできません。これは.mmファイルがこれを切り替えるものです。修正はキャストを使用することです:

char **paths = (char **)eventPaths; 

その後、FSEventStreamCreateに、それはこれに代え*空白を好きではなかった:

FSEventStreamContext *callbackInfo = NULL; 

...、代わりにCFAbsoluteTimeを好きではなかったですof:

次に、CoreServices.frameworkライブラリをビルドステップに追加する必要があります。

私はこれらの変更を加え、現在コンパイルしています。

関連する問題