سؤال

هذا يقودني للجنون.لدي ماكرو محدد في سطر الأوامر باستخدام ملحق -D خيار

-DFOO="foobarbaz"

وبعد ذلك أريد أن أفعل شيئًا كهذا

string s = "FOO" ;

تحصل

string s = "foobarbaz" ;

لأنه من الواضح أن علامات الاقتباس من سطر الأوامر قد تم تجريدها، حتى عندما أحاول الهروب منها \.لقد جربت كل ما يمكن أن أفكر فيه من خلال التوحيد ووحدات الماكرو الإضافية ولن ينجح الأمر.إما أن أحصل على خطأ من المعالج المسبق بشأن أنه في غير محله # علامات، أو في نهاية المطاف مع

string s = foobarbaz ;

والتي من الواضح أنها لن تجمع.

هل كانت مفيدة؟

المحلول

استخدم هذا في سطر الأوامر:

-DFOO="\"hello world\""

على سبيل المثال test.cpp هو:

#include <cstdio>
#include <string>
#include <iostream>

std::string test = FOO;

int main()
{
    std::cout << test << std::endl;
    return 0;
}

التجميع والتشغيل يعطي:

$ g++ -DFOO="\"hello world\"" test.cpp
$ ./a.out 
hello world

يحرر هذه هي الطريقة التي ستفعل بها ذلك من ملف Makefile:

DEFS=-DFOO="\"hello world\""

test: test.cpp
    $(CXX) $(DEFS) -o test test.cpp

نصائح أخرى

تم ضبط معالجات C وC++ الأولية على C وC++ لا المعالجات الأولية الأولية بايت بايت.يتعرفون على السلاسل (كما في "foo") ولن يتطابق ويتوسع بداخلها.إذا كنت تريد توسيع ماكرو، فيجب عليك القيام بذلك خارج السلسلة.على سبيل المثال،

#define foo "bar"

#include <string>

int main () {
    std::string s = "Hello " foo "! How's it going?";
}

سوف تتوسع السلسلة أعلاه إلى

Hello bar! How's it going?
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top