Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
A fost lansat Ubuntu 24.04 LTS

Free streaming SkyShowtime de la ...

Skoda Fabia 1.0 TSI (110 CP)- 19 ...

Mezina familiei, Merida BigNine
 The Tattooist of Auschwitz (2024)

Se poate recupera numar de telefo...

Upgrade de la MacBook Pro M1 cu 8...

Ce tip de monitor am nevoie pt of...
 Resoftare camera supraveghere

Laptop Gaming

Cu ce va aparati de cainii agresi...

Nu imi platiti coletul cu cardul ...
 Exista vreun plan de terorizare p...

Schimbare adresa DNS IPv4 pe rout...

Recomandare Barebone

Monede JO 2024
 

Concatenare string in macro

- - - - -
  • Please log in to reply
4 replies to this topic

#1
GabyF

GabyF

    Junior Member

  • Grup: Members
  • Posts: 235
  • Înscris: 27.09.2006
Se pot concatena doua stringuri in macro?

#define PATH "img/"
#define M_CONC(A, B) A##B

#define BG_IM M_CONC(PATH, "bg.png")


Apare un rezultat ciudat img/"bg.png

#2
Turcalet

Turcalet

    Member

  • Grup: Members
  • Posts: 285
  • Înscris: 26.12.2020
Muta bg.png la alta definitie gen

#define BGFILE "bg.png"

si dupa aia

#define BG_IM M_CONC(PATH, BGFILE)

#3
sags

sags

    Senior Member

  • Grup: Senior Members
  • Posts: 9,953
  • Înscris: 24.04.2013
O observatie: NU este nevoie de operatorul ‘token pasting’ pentru literali de tip sir intrucat pe acestia compilatorul ii concateneaza automat fara ca tu sa faci nimic special, atata timp cat intre ei nu exista decat whitespace (comentariile intra si ele in aceasta categorie). Adica "Un"/*inceputul*/ "Doi"/*partea a doua*/ este absolut acelasi lucru cu "UnDoi". La fel, in cazul tau, PATH "bg.png" este exact acelasi lucru cu "img/bg.png" fara sa fie nevoie de nici un macro auxiliar care sa concateneze.

Token pasting’ este necesar cand vrei sa creezi identificatori. De exemplu const int M_CONC(constanta, unu) = 1; defineste si initializeaza variabila nemodificabila constantaunu. Fara token pasting nu ai putea crea un identificator ‘din bucati’.

#4
GabyF

GabyF

    Junior Member

  • Grup: Members
  • Posts: 235
  • Înscris: 27.09.2006
Deci in fisierul .rc am:

BG_ID  PNG BG_IM


Iar in Resource.h am:

#define PATH "img/"
#define BG_ID  100
#define BG_IM   PATH "bg.png"


Raspuns:

Quote

1>.\Resource.rc(3) : error RC2135 : file not found: img/
1>.\Resource.rc(4) : error RC2135 : file not found: PNG
1>.\Resource.rc(5) : error RC2135 : file not found: PNG
1>.\Resource.rc(6) : error RC2135 : file not found: PNG
1>.\Resource.rc(7) : error RC2135 : file not found: PNG
1>.\Resource.rc(8) : error RC2135 : file not found: PNG
1>.\Resource.rc(9) : error RC2135 : file not found: PNG
1>.\Resource.rc(10) : error RC2135 : file not found: PNG
1>.\Resource.rc(11) : error RC2135 : file not found: PNG
1>.\Resource.rc(14) : error RC2135 : file not found: PNG
1>.\Resource.rc(15) : error RC2135 : file not found: PNG
1>.\Resource.rc(16) : error RC2135 : file not found: PNG

#5
sags

sags

    Senior Member

  • Grup: Senior Members
  • Posts: 9,953
  • Înscris: 24.04.2013
Resource Compiler nu foloseste foloseste acelasi preprocesor si nici nu are aceleasi reguli ca si compilatorul de C/C++, este mult mai limitat dar are in schimb alte lucruri mai adaptate situatiei.

Ce am facut eu a fost ca in proiect sa setez ‘Custom Build’ pe fisierele de resurse, apeland mai intai compilatorul de C/C++ cu optiunea de a face doar preprocesarea si a produce fisierul preprocesat si abia apoi compilatorul de resurse pe acest fisier intermediar.
cl /Zm200 /I… /D… /DRC_INVOKED /E /TC "%(Filename).rc" >"$(IntDir)%(Filename).rc"
rc /I… /Fo"$(IntDir)%(Filename).res" "$(IntDir)%(Filename).rc"
  • /Zm este ca sa nu dea pe-afara fiindca am meleoane de #define-uri. Il poti omite daca nu esti intr-o asemenea situatie.
  • /D si /I pentru #define respectiv directoare include suplimentare, dupa nevoie. De exemplu optiuni specifice pentru debug versus release.
  • /DRC_INVOKED ca asa ar fi la apel direct Resurce Compiler. Compilarea sa fie cat mai aproape de ceea ce ar fi daca nu as avea preprocesarea C/C++. Unele headere se folosesc de RC_INVOKED pentru a include #define necesare resurselor dar a exclude chestii specifice C/C++ (si care ar da eroare in Resource Compiler) cum ar fi prototipuri de functii.
  • /E impreuna cu redirectarea iesirii e cheia. Cere doar precompilare cu iesire la stdout, iar stdout e scris in acel fisier.
  • /TC ii zice sa foloseasca compilatorul de C nu C++, avand in vedere ca nu poate decide automat dupa extensia fisierului de intrare.
Insa trebuie verificat daca asa se face sau nu concatenarea constantelor sir (depinde in ce faza se face, preprocesare sau compilare, nu stiu pe dinafara), ca parca vag mi-aduc aminte ca am avut probleme din acest punct de vedere.

LE: Dupa ceva sapaturi, se pare ca aceasta concatenare nu o face preprocesorul de C/C++ si ramane in sarcina Resource Compiler. Cel din Visual Studio 6 (da, da, cel de prin 1998) nu stie sa o faca, dar cu versiuni mai ne-antice trebuie ca functiona ca altfel nu as fi folosit-o intr-o vreme (la un moment dat am renuntat la ea).

Edited by sags, 21 February 2023 - 16:24.


Anunturi

Bun venit pe Forumul Softpedia!

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate