Esa macro intenta producir un error de compilación si el argumento es verdadero (no -cero ). Lo hace definiendo una estructura con un campo de bits cuya longitud se vuelve negativa si e
es verdadero.
Basado en las respuestas de esta pregunta en Stackoverflow , el problema es que el el truco utilizado en la macro no es compatible con C++, exactamente por la razón indicada en el mensaje de error :a diferencia de C, C++ no permite definir un struct
dentro de sizeof
.
El kernel de Linux solo usa C, por lo que probablemente no les importen las incompatibilidades con C++ en los encabezados que usa el kernel.
Las respuestas a la pregunta vinculada contienen alternativas compatibles con C++ con el mismo efecto.
pandoc — отличный инструмент командной строки -для преобразования форматов файлов.
Недостатком является то, что для вывода PDF вам потребуется LaTeX. Использование
pandoc test.html -t latex -o test.pdf
Если у вас не установлен LaTeX, я рекомендую htmldoc .
Цитируется из Создание PDF-файла
By default, pandoc will use LaTeX to create the PDF, which requires that a LaTeX engine be installed.
Alternatively, pandoc can use ConTeXt, pdfroff, or any of the following HTML/CSS-to-PDF-engines, to create a PDF: wkhtmltopdf, weasyprint or prince. To do this, specify an output file with a.pdf extension, as before, but add the --pdf-engine option or -t context, -t html, or -t ms to the command line (-t html defaults to --pdf-engine=wkhtmltopdf).
Вы также можете попробовать wkhtmltopdf , использование и установка довольно просты.
Я успешно использую ветку 1.8 HTMLDOC в течение многих лет. Я поместил его в коммерческую систему, которая с 2003 года сгенерировала сотни тысяч отчетов.
Он не супер -универсальный, но очень эффективный и надежный. Он ограничен базовым набором постскриптумных шрифтов.
Он не поддерживает CSS, вместо этого использует специальный набор директив комментариев HTML для управления специфическими аспектами PDF.
Исходный код не слишком сложен для чтения и редактирования, если вам нужно добавить пользовательские средства, если вы знакомы с C. Он скомпилирован с помощью GCC или Visual Studio, в зависимости от вашей целевой платформы.
Обратите внимание, что HTML не обязательно должен находиться в файле. Вы можете сгенерировать его динамически из URL-адреса, php или aspx и т. д. Вы также можете подключить его к своему веб-серверу для динамического создания файла PDF.
В моем случае он генерирует файл PDF из страницы asp, который затем прикрепляется к электронному письму, вместо отправки HTML на принтер и машину для заполнения писем; это своего рода диспетчер очереди печати.
Существует также программа html2ps, с помощью которой можно легко преобразовать файл PostScript в формат pdf. Я использовал это несколько лет назад, и IIRC неплохо справился с большим руководством.
PhantomJS может сделать эту работу за вас. Он имеет функциональность командной строки и работает из коробки. Вам потребуется написать простую функцию Javascript, чтобы сообщить ей, что делать. На сайте есть краткое руководство и множество статей в Интернете, которые помогут вам. Обычно используется следующее:
phantomjs configFile.js htmlFile.html output.pdf
Вот пример скрипта для создания портретного PDF-файла формата A4, взятого из здесь , сохраните как ваш configFile.js
var page = require('webpage').create(),
system = require('system'),
fs = require('fs');
page.paperSize = {
format: 'A4',
orientation: 'portrait',
margin: {
top: "1.5cm",
bottom: "1cm"
},
footer: {
height: "1cm",
contents: phantom.callback(function (pageNum, numPages) {
return '' +
'<div style="margin: 0 1cm 0 1cm; font-size: 0.65em">' +
' <div style="color: #888; padding:20px 20px 0 10px; border-top: 1px solid #ccc;">' +
' <span>REPORT FOOTER</span> ' +
' <span style="float:right">' + pageNum + ' / ' + numPages + '</span>' +
' </div>' +
'</div>';
})
}
};
page.settings.dpi = "96";
page.content = fs.read(system.args[1]);
var output = system.args[2];
window.setTimeout(function () {
page.render(output, {format: 'pdf'});
phantom.exit(0);
}, 2000);