Articles of c preprocessore

La dimensione di (enum) == sizeof (int), sempre?

La dimensione di (enum) == sizeof (int), sempre? O dipende dal compilatore? È sbagliato dire che il compilatore è ottimizzato per le lunghezze delle parole (allineamento della memoria), cioè y int è la dimensione della parola su un particolare compilatore? Significa che non c’è penalità di elaborazione se uso le enumerazioni, dato che sarebbero allineate […]

Capire contenitore_di macro nel kernel di Linux

Durante la navigazione nel kernel di Linux, ho trovato un container_of macro che è definito come segue: #define container_of(ptr, type, member) ({ \ const typeof( ((type *)0)->member ) *__mptr = (ptr); \ (type *)( (char *)__mptr – offsetof(type,member) );}) Capisco cosa fa container_of do, ma quello che non capisco è l’ultima frase, che è (type […]

Macro di dimensione array che rifiuta i puntatori

La macro standard della dimensione dell’array che viene spesso insegnata è #define ARRAYSIZE(arr) (sizeof(arr) / sizeof(arr[0])) o qualche formazione equivalente. Tuttavia, questo genere di cose riesce silenziosamente quando viene passato un puntatore, e fornisce risultati che possono sembrare plausibili in fase di runtime fino a quando le cose non scompaiono misteriosamente. È fin troppo facile […]

Numero di riga C / C ++

Per motivi di debug, posso ottenere il numero di riga nei compilatori C / C ++? (modo standard o modi specifici per determinati compilatori) per esempio if(!Logical) printf(“Not logical value at line number %d \n”,LineNumber); // How to get LineNumber without writing it by my hand?(dynamic compilation)

Dovrei usare #define, enum o const?

In un progetto C ++ su cui sto lavorando, ho un tipo di valore di flag che può avere quattro valori. Quelle quattro bandiere possono essere combinate. Le bandiere descrivono i record nel database e possono essere: nuovo record record cancellato record modificato record esistente Ora, per ogni record, desidero mantenere questo attributo, quindi potrei […]

Cambia C # DllImporta il codice target in base a x64 / x86

Possibile duplicato: direttiva preprocessore … C # Ho un dll esterno c ++ da importare usando DLLImport. Se la mia applicazione si sta compilando in x64 ho bisogno di importare la versione x64 di questa dll, se è una build x86, ho bisogno della dll x86. Qual è il modo migliore per raggiungere questo objective? […]

Obiettivo C: Dichiarazione di class successiva

Sto scrivendo un’app multiview che utilizza una class chiamata RootViewController per passare da una vista all’altra. Nella mia intestazione MyAppDelegate , creo un’istanza di RootViewController chiamata rootViewController . Ho visto esempi di tali casi in cui la direttiva @class viene utilizzata come una “dichiarazione di forward class”, ma non sono abbastanza sicuro di cosa significhi […]

Perché il preprocessore C interpreta la parola “linux” come costante “1”?

Perché il preprocessore C in GCC interpreta la parola linux (lettere minuscole) come costante 1 ? test.c: #include int main(void) { int linux = 5; return 0; } Risultato di $ gcc -E test.c (interruzione dopo la fase di pre-elaborazione): …. int main(void) { int 1 = 5; return 0; } Il che, naturalmente, produce […]

Quali sono i caratteri validi per i nomi macro?

I nomi delle macro in stile C sono soggetti alle stesse regole di denominazione degli identificatori? Dopo un aggiornamento del compilatore, ora sta emettendo questo avviso per un’applicazione legacy: warning #3649-D: white space is required between the macro name “CHAR_” and its replacement text #define CHAR_& 38 Questa riga di codice definisce una costante di […]

Stringificazione – come funziona?

Lo so: #define foo 4 #define str(s) #s con str(foo) scrive: “foo” , perché stringify viene eseguito prima dell’espansione del testo, ma questo: #define xstr(s) str(s) #define str(s) #s #define foo 4 con xstr(foo) scrive: “4” . Perché? Quali sono i passaggi coinvolti nel processo?