Typedef conditionnel d’exécution en C

Je sais qu’il existe une version C ++ de cette question, mais j’utilise des typedefs standard et non des modèles.

J’ai écrit un programme qui fonctionne avec les fichiers wav 16 bits. Pour ce faire, il charge chaque échantillon dans un court métrage. Le programme exécute ensuite l’arithmétique sur le court.

Je suis en train de modifier le programme afin qu’il puisse fonctionner avec des ondes de 16 et 32 ​​bits. J’espérais faire un typedef conditionnel, c.-à-d. En utilisant short pour 16 bits et int pour 32 bits. Mais ensuite, j’ai réalisé que le compilateur ne comstackrait probablement pas le code s’il ne savait pas quel type de variable était auparavant.

J’ai donc essayé de tester le code suivant:

#include  int main() { int i; scanf("%i", &i); typedef short test; if(i == 1) typedef short sample; else typedef int sample; return 0; } 

Et obtenu les erreurs de compilateur suivantes:

 dt.c: In function 'main': dt.c:12:5: error: expected expression before 'typedef' dt.c:14:5: error: expected expression before 'typedef' 

Cela signifie-t-il que les typedefs conditionnels d’exécution en C ne sont pas possibles?

[Question ouverte:] Si non, comment allez-vous gérer quelque chose comme ça?

Tous les types d’un programme doivent être connus au moment de la compilation.

En C ++, vous pouvez comstackr votre code pour short et int utilisant des modèles; en C, vous pouvez le faire en utilisant des macros (spécifiquement, les macros X).

Placez votre code de calcul dans un fichier séparé appelé par exemple dt.tmpl.c , puis dans dt.c écrivez:

 #define sample int #include "dt.tmpl.c" #define sample short #include "dt.tmpl.c" 

Votre code dt.tmpl.c peut ensuite utiliser sample comme jeton de préprocesseur pour nommer les types et les coller dans les noms de fonctions, par exemple:

 #define PASTE(name, type) name ## _ ## type #define FUNCTION_NAME(name, type) PASTE(name, type) sample FUNCTION_NAME(my_calculation, sample)(sample i) { return i * 2; } 

Cela se traduira par deux fonctions int my_calculation_int(int i) et short my_calculation_short(short i) que vous pourrez ensuite utiliser ailleurs.

typedef est une fonctionnalité du compilateur, vous ne pouvez pas l’appliquer au moment de l’exécution.

D’autre part, vous pouvez utiliser typedef uniquement dans une certaine mesure.

 int main(void) { if (1) { typedef short sample; sample n; // OK } sample u; // ERROR return 0; } 

tout d’abord, une typedef n’est pas un nouveau type, c’est un alias ou une forme abrégée pour rendre les choses plus pratiques (surtout lorsque vous travaillez avec des pointeurs de fonction)

C est un langage statique, vous ne pouvez pas créer de type en cours d’exécution, le type doit être résolu au moment de la compilation / du lien.

Eh bien, si cela était possible, l’API Windows serait tellement beaucoup plus petit 🙂

dans Windows, ils ont deux versions de fonctions pour la plupart des appels d’API et une définition qui décide laquelle utiliser.

par exemple

 #ifndef UNICODE #define myfunction _myfunctionA(TCHAR* p); #else #define myfunction _myfunctionW(TCHAR* p); #endif 

mais encore une fois, le type est décidé au moment de la compilation

Les types en C (et C ++) sont fixés au moment de la compilation; le concept de ‘ typedef runtime’ n’a pas de sens en C.

Cependant, votre problème peut être résolu avec précaution. Vous allez définir deux ensembles de fonctions (et types), l’un pour traiter les fichiers .wav 16 bits et l’autre pour les fichiers .wav 32 bits. Celles-ci seront définies au moment de la compilation et la taille des types sera fixée au moment de la compilation, mais les deux lots de code seront dans l’exécutable, et vous pourrez choisir quel ensemble de fonctions à exécuter en fonction de l’exécution. informations temporelles (type de fichier que vous êtes invité à traiter ou à produire).

Vos deux ensembles de fonctions doivent être symésortingques. Vous pourrez peut-être utiliser un mécanisme de type “modèle” pour comstackr le même fichier deux fois, une fois pour le code 32 bits, une fois pour le code 16 bits, en veillant à ce que les noms de fonctions soient modifiés de manière cohérente.