نقلا عن القيمة الموسعة للماكرو
-
12-12-2019 - |
سؤال
هذا يقودني للجنون.لدي ماكرو محدد في سطر الأوامر باستخدام ملحق -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?