AMcoder - javascript, python, java, html, php, sql

ինչպես ներառել տեքստային ֆայլը որպես տող կոմպիլյացիայի ժամանակ՝ առանց c++11 տողի բառացի նախածանց և վերջածանց ավելացնելու տեքստային ֆայլում

Ես տեղյակ եմ բազմաթիվ նմանատիպ հարցերի մասին այս կայքում: Ինձ շատ է դուր գալիս, որ լուծումը նշված է հետևյալ հղումով.

https://stackoverflow.com/a/25021520/884553

Որոշ փոփոխություններով կարող եք տեքստային ֆայլ ներառել կոմպիլյացիայի ժամանակ, օրինակ՝

constexpr const char* s = 
#include "file.txt"

ԲԱՅՑ այս աշխատանքը կատարելու համար դուք պետք է ավելացնեք տողի բառացի նախածանց և վերջածանց ձեր բնօրինակ ֆայլին, օրինակ.

R"(
This is the original content,
and I don't want this file to be modified. but i
 don't know how to do it.
)";

Հարցս հետևյալն է. կա՞ տարբերակ, որ այս գործն աշխատի, բայց չփոփոխվի file.txt-ը:

(Ես գիտեմ, որ կարող եմ օգտագործել հրամանի տողի գործիքները պատճենելու, պատճենելու և պատճենին կցելու, պատճենը հավաքելուց հետո հեռացնելու համար: Ես ավելի էլեգանտ լուծում եմ փնտրում, քան սա: հուսով եմ, որ այլ գործիքների կարիք չկա)

Ահա թե ինչ եմ փորձել (բայց չի աշխատում).

#include <iostream>

int main() {
  constexpr const char* s =
#include "bra.txt"  // R"(
#include "file.txt" //original file without R"( and )";
#include "ket.txt"  // )";
  std::cout << s << "\n";
  return 0;
}

/opt/gcc8/bin/g++ -std=c++1z a.cpp
In file included from a.cpp:5:
bra.txt:1:1: error: unterminated raw string
 R"(
 ^
a.cpp: In function ‘int main()’:
a.cpp:4:27: error: expected primary-expression at end of input
   constexpr const char* s =
                           ^
a.cpp:4:27: error: expected ‘}’ at end of input
a.cpp:3:12: note: to match this ‘{’
 int main() {
            ^
21.09.2018

  • ինչ սխալ եք ստանում ներառումը պարզապես օգտագործում է նախապրոցեսոր, որը հիմար մեքենա է, այն պարզապես միավորում է իրերը... ձեր կոդը պետք է աշխատի: 21.09.2018
  • Ես տեղադրում եմ սխալը: 21.09.2018
  • փորձե՞լ եք նաև -E տարբերակը (եթե օգտագործում եք gcc) stackoverflow.com/a/4900890/700825 21.09.2018
  • Ենթադրում եմ, որ դուք բացակայում եք; տողերի հայտարարությունից հետո: 21.09.2018
  • ոչ, ; գտնվում է ket.txt-ում 21.09.2018
  • անցնելը -E չի օգնի, քանի որ այն կանգ է առել constexpr const char* s = սխալի պատճառով 21.09.2018
  • Ահ, խնդիրն այն է, որ նախապրոցեսորն ինձ նման չի աշխատում, և ես ենթադրում եմ, որ մտածում եք... այն բանից հետո, երբ մուտքագրեք R( ներառում է այլևս աշխատանքը... (դրանք դիտարկվում են որպես տող, մինչև չփակեք հումքի տողը) տես սա. a href="https://wandbox.org/permlink/mdR5930Zwvuk3YXE" rel="nofollow noreferrer">wandbox.org/permlink/mdR5930Zwvuk3YXE 21.09.2018
  • Թվում է, թե այդպես է, ես հուսով էի, որ կան որոշ հնարքներ, որոնք կարող են ասել, որ կոմպիլը գնահատի բլոկը ներառման ավարտից հետո: 21.09.2018

Պատասխանները:


1

Ոչ, դա հնարավոր չէ անել:

Կա c++2a առաջարկ՝ թույլատրել ներառել այդպիսի ռեսուրսները կոմպիլյացիայի ժամանակ, որը կոչվում է std::embed:

Այս p1040r1 առաջարկի մոտիվացիոն մասը.

Մոտիվացիա

Յուրաքանչյուր C և C++ ծրագրավորող, ինչ-որ պահի, փորձում է #include ոչ C++ տվյալների մեծ կտորներ մտցնել իր կոդի մեջ: Իհարկե, #include-ն ակնկալում է, որ տվյալների ձևաչափը կլինի սկզբնական կոդը, և, հետևաբար, ծրագիրը ձախողվում է տպավորիչ lexer սխալներով: Այսպիսով, շատ տարբեր գործիքներ և պրակտիկաներ հարմարեցվել են դա կարգավորելու համար դեռևս 1995 թվականին xxd գործիքով: Շատ ճյուղեր նման ֆունկցիոնալության կարիք ունեն, ներառյալ (բայց հազիվ թե սահմանափակվեն հետևյալով).

  • Ֆինանսական զարգացում

    • representing coefficients and numeric constants for performance-critical algorithms;
  • Խաղի մշակում

    • ակտիվներ, որոնք չեն փոխվում գործարկման ժամանակ, ինչպիսիք են պատկերակները, ֆիքսված հյուսվածքները և այլ տվյալներ

    • Shader և scripting կոդը;

  • Ներկառուցված զարգացում

    • երկուականի մեծ կտորների պահպանում, օրինակ՝ որոնվածը, լավ սեղմված ձևաչափով

    • հիշողության մեջ տվյալների տեղադրում չիպերի և համակարգերի վրա, որոնք չունեն օպերացիոն համակարգ կամ ֆայլային համակարգ.

  • Դիմումների մշակում

    • սեղմված երկուական բլբեր, որոնք ներկայացնում են տվյալներ

    • ոչ C++ սցենարի կոդը, որը չի փոխվում գործարկման ժամանակ; և

  • Սերվերի մշակում

    • configuration parameters which are known at build-time and are baked in to set limits and give compile-time information to tweak performance under certain loads

SSL/TLS վկայագրեր՝ կոշտ կոդավորված ձեր գործարկվող սարքի մեջ (պահանջում է վերակառուցում և հնարավոր թույլտվություն՝ նախքան նոր վկայագրերի տեղակայումը):

Այս նպատակին հասնելու համար այս գործիքներն ապացուցել են, որ ունեն անբավարարություն և վատ են նպաստում C++-ի զարգացման ցիկլին, քանի որ այն շարունակում է ընդլայնվել ավելի մեծ և ավելի լավ ցածրակարգ սարքերի և բարձր արդյունավետության մեքենաների համար՝ զբաղեցնելով ծրագրավորողներին աննշան կառուցման առաջադրանքները և փորձում է ծածկել հարթակների միջև հիասթափեցնող տարբերությունները:

MongoDB-ն բավական բարի է եղել կիսվել ստորև ներկայացված իրենց ծածկագրերից: Մյուս ընկերություններն իրենց օրինակի ծածկագիրը անանունացրել են կամ ուղղակիորեն չեն ներառել ամոթից այն բաների համար, որոնք նրանք պետք է անեն՝ իրենց աշխատանքային հոսքերին աջակցելու համար: Հեղինակը շնորհակալություն է հայտնում MongoDB-ին իրենց քաջության և std::embedին աջակցության համար:

#include_string-ի կամ նմանատիպ այլ ձևերի խնդրանքը վաղուց է ծագել, որի մասին տրված և պատասխանված ամենահին կույտային հարցերից մեկը մոտ 10 տարի առաջ է: Նույնիսկ դա ավելի վաղ է, փոստային ցուցակի հաղորդագրությունների և ֆորումի հաղորդագրությունների առատությունը, որոնք հարցնում են, թե ինչպես ստանալ սցենարի կոդը և այլ բաներ, որոնք, ամենայն հավանականությամբ, չեն փոխվի երկուական:

Այս փաստաթուղթը առաջարկում է <embed>՝ այս գործընթացը շատ ավելի արդյունավետ, շարժական և պարզեցված դարձնելու համար: Ահա իդեալի օրինակ.

#include <embed>

int main (int, char*[]) {
  constexpr std::span<const std::byte> fxaa_binary = std::embed( "fxaa.spirv" );
  
  // assert this is a SPIRV file, compile-time  
  static_assert( fxaa_binary[0] == 0x03 && fxaa_binary[1] == 0x02
    && fxaa_binary[2] == 0x23 && fxaa_binary[3] == 0x07
    , "given wrong SPIRV data, check rebuild or check the binaries!" )

  auto context = make_vulkan_context();

  // data kept around and made available for binary
  // to use at runtime
  auto fxaa_shader = make_shader( context, fxaa_binary );

  for (;;) {
    // ...
    // and we’re off!
    // ...
  }

  return 0;
}
21.09.2018
  • այս առաջարկը կարծես հենց այն է, ինչ ինձ պետք է: դեռ կա՞ վաղաժամ իրականացում: 21.09.2018
  • @TMS Ես թարմացրել եմ առաջարկի r1 հղումները և բովանդակությունը: Այն պարունակում է հղում դեպի իրականացում 21.09.2018
  • շնորհակալություն, ես կնշեմ ձեր պատասխանը այն ստուգելուց հետո: (հավանաբար առաջիկա մի քանի օրերի ընթացքում) 21.09.2018
  • Նոր նյութեր

    Օգտագործելով Fetch Vs Axios.Js-ը՝ HTTP հարցումներ կատարելու համար
    JavaScript-ը կարող է ցանցային հարցումներ ուղարկել սերվեր և բեռնել նոր տեղեկատվություն, երբ դա անհրաժեշտ լինի: Օրինակ, մենք կարող ենք օգտագործել ցանցային հարցումը պատվեր ներկայացնելու,..

    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար
    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար Ինչպե՞ս հանգստացնել ձեր միտքը և աշխատեցնել ձեր պրոցեսորը: Ինչպես մնալ հանգիստ և զարգանալ ճնշման տակ...

    Մեքենայի ուսուցում բանկային և ֆինանսների ոլորտում
    Բարդ, խելացի անվտանգության համակարգերը և հաճախորդների սպասարկման պարզեցված ծառայությունները բիզնեսի հաջողության բանալին են: Ֆինանսական հաստատությունները, մասնավորապես, պետք է առաջ մնան կորի..

    Ես AI-ին հարցրի կյանքի իմաստը, այն ինչ ասում էր, ցնցող էր:
    Այն պահից ի վեր, երբ ես իմացա Արհեստական ​​ինտելեկտի մասին, ես հիացած էի այն բանով, թե ինչպես է այն կարողանում հասկանալ մարդկային նորմալ տեքստը, և այն կարող է առաջացնել իր սեփական արձագանքը դրա..

    Ինչպես սովորել կոդավորումը Python-ում վագրի պես:
    Սովորելու համար ծրագրավորման նոր լեզու ընտրելը բարդ է: Անկախ նրանից, թե դուք սկսնակ եք, թե առաջադեմ, դա օգնում է իմանալ, թե ինչ թեմաներ պետք է սովորել: Ծրագրավորման լեզվի հիմունքները, դրա..

    C++-ի օրական բիթ(ե) | Ամենաերկար պալինդրոմային ենթաշարը
    C++ #198-ի ամենօրյա բիթ(ե), Ընդհանուր հարցազրույցի խնդիր. Ամենաերկար պալինդրոմային ենթատող: Այսօր մենք կանդրադառնանք հարցազրույցի ընդհանուր խնդրին. Ամենաերկար palindromic substring...

    Kydavra ICAReducer՝ ձեր տվյալների ծավալայինությունը նվազեցնելու համար
    Ի՞նչ է ICAReducer-ը: ICAReducer-ն աշխատում է հետևյալ կերպ. այն նվազեցնում է նրանց միջև բարձր փոխկապակցված հատկանիշները մինչև մեկ սյունակ: Բավականին նման է PCAreducer-ին, չնայած այն..