Выполненный C или файл C++ как сценарий

Самый простой способ исправить это - установить пакет разработчика QT:

sudo apt-get install qt5-default

Это установит нужные вам пакеты.

26
задан Reinstate Monica 20 March 2010 в 07:48
поделиться

7 ответов

Для C вы можете взглянуть на tcc , Tiny C Compiler. Запуск кода на C в качестве сценария является одним из его возможных применений.

29
ответ дан Remo.D 28 November 2019 в 06:04
поделиться
$ cat /usr/local/bin/runc
#!/bin/bash
sed -n '2,$p' "$@" | gcc -o /tmp/a.out -x c++ - && /tmp/a.out
rm -f /tmp/a.out

$ cat main.c
#!/bin/bash /usr/local/bin/runc

#include <stdio.h>

int main() {
    printf("hello world!\n");
    return 0;
}

$ ./main.c
hello world!

Команда sed берет файл .c и удаляет строку хэша. 2,$p означает печать строк 2 до конца файла; "$@" распространяется на аргументы командной строки для сценария runc, т.е. "main.c".

вывод sed передается в gcc. Передача - в gcc указывает ему читать из stdin, и когда вы делаете это, вы также должны указать исходный язык с помощью -x, поскольку у него нет имени файла, из которого можно угадать.

17
ответ дан John Kugelman supports Monica 28 November 2019 в 06:04
поделиться

CINT :

CINT - интерпретатор кода C и C ++. Это полезно, например для ситуаций, когда быстрое развитие более важно, чем время выполнения. Использование интерпретатора значительно сокращает цикл компиляции и компоновки, что способствует быстрой разработке. CINT делает программирование на C / C ++ приятным даже для программистов, занятых неполный рабочий день.

7
ответ дан Eli Bendersky 28 November 2019 в 06:04
поделиться

Возможно, вы захотите проверить ryanmjacobs / c , который был разработан для этого. Он действует как обертка вокруг вашего любимого компилятора.

#!/usr/bin/c
#include <stdio.h>

int main(void) {
    printf("Hello World!\n");
    return 0;
}

Приятной особенностью использования c является то, что вы можете выбрать, какой компилятор вы хотите использовать, например

$ export CC=clang
$ export CC=gcc

Так что вы получаете все свои любимые оптимизации тоже! Удар, что tcc -run!

Вы также можете добавить флаги компилятора в shebang, если они заканчиваются символами --:

#!/usr/bin/c -Wall -g -lncurses --
#include <ncurses.h>

int main(void) {
    initscr();
    /* ... */
    return 0;
}

c также использует $CFLAGS и $CPPFLAGS, если они также установлены.

5
ответ дан Brock Adams 28 November 2019 в 06:04
поделиться

Я знаю, что этим вопросом не является недавний, но я решил бросить свой ответ в соединение так или иначе. С Лязгом и LLVM, нет никакой потребности выписать промежуточный файл или назвать внешнюю программу/сценарий помощника. (кроме лязга/лязга ++/lli)

можно просто передать вывод по каналу лязга/лязга ++ к lli.

#if 0
CXX=clang++
CXXFLAGS="-O2 -Wall -Werror -std=c++17"
CXXARGS="-xc++ -emit-llvm -c -o -"
CXXCMD="$CXX $CXXFLAGS $CXXARGS [110]"
LLICMD="lli -force-interpreter -fake-argv0=[110] -"
$CXXCMD | $LLICMD "$@" ; exit $?
#endif

#include <cstdio>

int main (int argc, char **argv) {
  printf ("Hello llvm: %d\n", argc);
  for (auto i = 0; i < argc; i++) {
    printf("%d: %s\n", i, argv[i]);
  }
  return 3==argc;
}

Вышеупомянутое однако не позволяет Вам использовать stdin в своем c/c ++ сценарий. Если удар является Вашей оболочкой, то можно сделать следующее для использования stdin:

#if 0
CXX=clang++
CXXFLAGS="-O2 -Wall -Werror -std=c++17"
CXXARGS="-xc++ -emit-llvm -c -o -"
CXXCMD="$CXX $CXXFLAGS $CXXARGS [111]"
LLICMD="lli -force-interpreter -fake-argv0=[111]"
exec $LLICMD <($CXXCMD) "$@"
#endif

#include <cstdio>

int main (int argc, char **argv) {
  printf ("Hello llvm: %d\n", argc);
  for (auto i = 0; i < argc; i++) {
    printf("%d: %s\n", i, argv[i]);
  }
  for (int c; EOF != (c=getchar()); putchar(c));
  return 3==argc;
}
1
ответ дан 28 November 2019 в 06:04
поделиться

Поскольку строка shebang будет передана компилятору, а # указывает директиву препроцессора, она подавится на # !.

Что вы можете сделать, так это встроить make-файл в файл .c (как описано в this xkcd thread ).

#if 0
make $@ -f - <<EOF
all: foo
foo.o:
   cc -c -o foo.o -DFOO_C $0
bar.o:
   cc -c -o bar.o -DBAR_C $0
foo: foo.o bar.o
   cc -o foo foo.o bar.o
EOF
exit;
#endif

#ifdef FOO_C

#include <stdlib.h>
extern void bar();
int main(int argc, char* argv[]) {
    bar();
    return EXIT_SUCCESS;
}

#endif

#ifdef BAR_C
void bar() {
   puts("bar!");
}
#endif

Пара #if 0 #endif , окружающая make-файл, гарантирует препроцессор игнорирует этот фрагмент текста, а маркер EOF отмечает, где команда make должна прекратить синтаксический анализ ввода.

10
ответ дан 28 November 2019 в 06:04
поделиться

Вариатн Джона Кугельмана можно записать так:

#!/bin/bash
t=`mktemp`
sed '1,/^\/\/code/d' "$0" | g++ -o "$t" -x c++ - && "$t" "$@"
r=$?
rm -f "$t"
exit $r


//code
#include <stdio.h>

int main() {
    printf("Hi\n");
    return 0;
}
3
ответ дан 28 November 2019 в 06:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: