Exécutez la commande C ou C++ en tant que fichier de script
Donc c'est probablement un long shot, mais est-il possible d'exécuter un C ou C++ en tant que fichier de script? J'ai essayé:
#!/usr/bin/gcc main.c -o main; ./main
int main(){ return 0; }
Mais il dit:
./main.c:1:2: error: invalid preprocessing directive #!
- Il y a des interprètes: cint, ch; plus igcc et la stc va agir comme un. Il y a quelques questions à leur sujet quelque part par ici: stackoverflow.com/questions/69539/... stackoverflow.com/questions/584714/... et sans doute quelques autres. Et cela peut être un doublon: stackoverflow.com/questions/2277865/...
Vous devez vous connecter pour publier un commentaire.
Pour C, vous pouvez avoir un coup d'oeil à la stc, le petit C Compilateur. L'exécution de code C comme un script est un de ses utilisations possibles.
#!/usr/bin/tcc -run
Réponse courte:
Le truc, c'est que votre fichier texte doit être à la fois valide code C/C++ et d'un script shell. N'oubliez pas de
exit
à partir du shell script avant de l'interprète atteint le code C/C++, ou invoquerexec
de la magie.Courir avec
chmod +x main.c; ./main.c
.Un beau spectacle comme
#!/usr/bin/tcc -run
n'est pas nécessaire, parce que les systèmes de type unix déjà exécuter le fichier texte à l'intérieur de la coquille.(adapté de ce commentaire)
Je l'ai utilisé dans mon C++ script:
Si votre ligne de la compilation pousse trop, vous pouvez utiliser le préprocesseur (adapté de cette réponse) comme ce bon vieux C montre le code:
Bien sûr, vous pouvez mettre en cache le fichier exécutable:
Maintenant, pour la vraiment excentrique développeur Java:
D programmeurs de mettre simplement un beau spectacle au début du fichier texte sans casser la syntaxe:
stat -c %y a.out main.c
comparaison améliorerait. Un peu entre 1 et 2 semble prêt pour la production, lol.#!
et//
. Une idée d'où cela est documenté?La commande sed prend la
.c
fichier et des bandes de hachage-bang ligne.2,$p
signifie imprimer les lignes 2 à la fin du fichier;"$@"
s'étend aux arguments de ligne de commande pour le runc script, c'est à dire"main.c"
.du sed de sortie est transmise à gcc. En passant
-
à gcc dit-il à lire à partir de stdin, et quand vous faites cela, vous devez également préciser la langue source avec-x
car il n'a pas de nom de fichier pour le deviner à partir.#!/bin/bash /usr/local/bin/runc
la première ligne dansmain.c
quand vous allez à la bande à l'aide desed
de toute façon?.c
fichier dans un script bash et de la bombe avec une erreur de syntaxe.sed
avant la compilation.$ ./main.c
êtrerunc ./main.c
???./main.c
et exécutez le fichier C comme si il s'agissait d'un script shell.Depuis la ligne shebang seront passés au compilateur, et # indique une directive de préprocesseur, il va s'étouffer sur un #!.
Ce que vous pouvez faire est d'intégrer le makefile dans le .c fichier (tel que discuté dans ce xkcd fil)
La
#if 0 #endif
paire environnant les makefile assurer le préprocesseur ignore que la section de texte, et le marqueur EOF marque l'endroit où la commande make devrait cesser d'entrée lors de l'analyse.CINT:
Vous pourriez voulez extraire ryanmjacobs/c qui a été conçu pour cela à l'esprit. Il agit comme un wrapper autour de votre favori compilateur.
La bonne chose à propos de l'utilisation de
c
est que vous pouvez choisir quel compilateur que vous souhaitez utiliser, par exemple,De sorte que vous obtenez tous vos favoris optimisations trop! Battre
tcc -run
!Vous pouvez également ajouter des drapeaux de compilation pour le shebang, tant qu'ils sont arrêtées avec la
--
caractères:c
utilise également$CFLAGS
et$CPPFLAGS
si elles sont définies en tant que bien.Cette redirige correctement les arguments et le code de sortie trop.
Tout à fait une courte proposition serait d'exploiter:
Le "#" est un commentaire dans la coquille et "#if 0" désactivation du code.
Alors vous pouvez
chmod +x
votre .rpc fichiers puis./run.cpp
../run.cpp Hi
a.out
, de sorte que vous pouvez avoir plusieurs fichiers binaires dans le même dossier.Problèmes:
/bin/sh
, est connu par l'expérience ou par un spec?Variatn de Jean Kugelman peut être écrit de cette manière:
: /*
après le shebang et#*/
après laexit
de la commande, puis l'IDE va ignorer tous les autres bash choses.#!/bin/bash : /*
résultats dans l'erreur la recherche d'un fichier: /*
parce que la ligne de commande maintenant l'aspect/bin/bash : /* ./man.c
. D'ailleurs, je crois que certains IDE défaillance de l'état pour inproper pré-instruction du processeur#!/bin/bash ...
.: /*
la ligne suivante après la ligne shebang. Concernant les IDEs ne pas aimer le shebang (ou la prochaine ligne de départ avec:
- oui, sans doute. L'Ide que j'utilise habituellement la marque comme des erreurs mais n'en faites pas une histoire autre que cela, et le reste du fichier est analysé correctement.#if 0
et#endif
comme suggéré par @Effatà fonctionnera également.sed
expression - vous pouvez simplement donner de gcc le fichier en entier (sans le shebang). L'en-tête pourrait alors ressembler à ceci (notez le "\n"s dans le texte, les commentaires ne sont pas de ligne orientée):#!/bin/bash\n#if 0\n t=$(mktemp -u);g++ -o $t -x c++ <(tail -n+2 $0) && $t "$@"; r=$?; rm -f $t; exit $r\n#endif
sed
. J'ai juste souligné le fait que les deux#if 0
/#endif
et/* .. */
fonctionnera très bien pour cacher un peu de code à partir de la plupart des IDEs.Voici encore une autre alternative: