Однострочная C программа с включенным? - PullRequest
2 голосов
/ 09 марта 2012

Прямо сейчас у меня есть это

#include <zlib.h>
int main ()
{
    puts (ZLIB_VERSION);
}

Как упражнение, есть ли способ заставить его скомпилировать в одну строку, что-то вроде

#include <zlib.h>; int main (){ puts (ZLIB_VERSION); }

Я могу заставить его скомпилироваться в две строки, но включение предотвращает одну строку.

Ответы [ 4 ]

5 голосов
/ 09 марта 2012

Нет способа сделать именно то, что вы хотите. С учетом сказанного, если это часть системы сборки, было бы намного лучше использовать опцию -E для компилятора для предварительной обработки файла, содержащего просто

#include <zlib.h>
ZLIB_VERSION

и затем проанализируйте вывод. Таким образом, вы избегаете запуска программы, сгенерированной компилятором, поэтому ваша сборка не прерывается при кросс-компиляции.

1 голос
/ 09 марта 2012

Нет, директива include идет своей строкой.

Соответствующей частью стандарта является C11 6.10.2 Source file inclusion, где он определяет директиву #include как одну из:

# include <h-char-sequence> new-line
# include "q-char-sequence" new-line

Обратите внимание, что символ новой строки является неотъемлемой частью директивы.

Я не полностью уверен, зачем вам это нужно на одной линии в любом случае. Большинство программ, которые могут выводить текст, могут в любом случае довольно легко вводить новые строки в поток, например:

pax> printf '#include<stdio.h>\nint main(void){return puts("Hi"),0;}' \
...> | gcc -o testprog -xc -

pax> ./testprog
Hi
0 голосов
/ 08 июня 2012

Будучи немного наивным, стандартный C требует пустой новой строки в конце вашего исходного кода, поэтому однострочные программы, которые действительно что-то делают, невозможны.

Обновление: это больше не требуется в C ++ 11

0 голосов
/ 09 марта 2012

Это зависит от того, сколько файлов вы ограничены.Если это не один, то вы можете добавить другой файл, который содержит весь код и #include этот.Например:

some_header.h:

include <zlib.h> 
int main () 
{
    puts (ZLIB_VERSION); 
}

main.c:

include "some_header.h"

Но я не думаю, что вы действительно этого хотите.Как и все остальные, препроцессор имеет дело со строками, и в Си нет разделителя для начала новой строки для препроцессора.(Существует разделитель \, который заставляет препроцессор обрабатывать следующую строку как продолжение текущей, но не как обратную.)

...