2016-07-18 154 views
6

Dopo aver letto su extern e statico, io sono confuso di venire attraverso il codice che ha la riga sotto:extern "C" static void * Funzione

extern "C" static void* foo(int* a){ 
    return foo1(a); 
} 

Perché questo non genera alcun errore?

+0

Curioso: quale compilatore su quale piattaforma? Si noti che il corpo della funzione non può essere compilato ('return foo1 (int * a);' non è valido C++). Quando compilato con G ++ 6.1.0 su Mac OS X 10.11.6, dal file di origine 'bust-cpp.cpp', usando la riga di comando:' g ++ -O3 -g -I./inc -std = C++ 11 -Wall -Wextra -Werror -c bust-cpp.cpp' Ottengo i messaggi: 'bust-cpp.cpp: 1: 12: errore: uso non valido di 'statico' nella specifica del collegamento 'che punta a ' extern "C" statico void * foo (int * a) {'. –

+0

probabilmente questo è in un file che non viene mai compilato –

+0

gcc-5.1 non compilerà [che] (http://ideone.com/15OaqR) – PcAF

risposta

2

I seguenti compila e sembra di fare ciò che la linea sta cercando di fare:

extern "C" { 
    static void* foo(int* a){ 
    return foo1(int* a); 
    } 
} 

Io non sono sicuro perché qualcuno vorrebbe questo, però.

"statico" significa che foo() sarà disponibile solo nell'ambito del file.

La 'C "statica influisce sul nome della funzione utilizzata dal linker se/quando viene esportata, in modo che la funzione possa essere richiamata da altri file oggetto quando l'intero programma è collegato. Solitamente, questo è usato quando vuoi collegare al file oggetto, creato da C source dove è stato definito foo(), o dove vuoi definire foo(), in modo che possa essere usato da un oggetto build creato da C .

Il "statica" cause foo() per non essere esportate, anche se ... quindi è difficile vedere come sono entrambi "aiutando".

L'unica cosa che posso venire con per perché foo() sarebbe stata dichiarata in questo modo sarebbe per un programma di test in cui qualcuno ha deciso di cercare di ignorare il significato di foo() all'interno di un file oggetto così uno da un file diverso verrebbe ignorato.

+1

Sono abbastanza sicuro che la ragione della funzione extern/static è di passare un puntatore a qualcosa che vuole un callback in C. A rigor di termini, non è valido passare un puntatore a una funzione con collegamento C++ a qualcosa che ha bisogno di una funzione C callable, anche se funziona in pratica. Di solito viene utilizzata una semplice vecchia funzione "extern" C "', ma perché ingombrare lo spazio dei nomi globale per qualcosa a cui si desidera solo un puntatore? –

+1

Infatti, lo standard C++ 11 utilizza 'extern" C "{static void f4(); } 'come esempio in 7.5" Specifiche del collegamento ". Il commento di accompagnamento dice: "il nome della funzione f4 ha un collegamento interno (non il collegamento al linguaggio C) e il tipo di funzione ha il collegamento al linguaggio C". –

+0

Basta fare lo "statico" dovrebbe essere sufficiente per mantenere foo() fuori dallo spazio dei nomi globale. Il bit sul non essere in grado di passare una funzione di collegamento a "C" * come un puntatore * al codice C++ e viceversa sembra strano. Il collegamento riguarda * il nome * mentre il puntatore alla funzione riguarda gli indirizzi fisici. Sembrano essere idee ortogonali. Poi di nuovo, i miei giorni come avvocato linguistico sono lontani nel passato, quindi ... –

Problemi correlati