সিএমকে একাধিক লাইনে স্ট্রিং কীভাবে বিভক্ত করবেন?


97

আমার প্রজেক্টে সাধারণত আমার নীতি থাকে, যাতে টেক্সট ফাইলে কখনও লাইন তৈরি না করা যায় যা 80 এর লাইনের দৈর্ঘ্য অতিক্রম করে না, তাই এগুলি সহজেই সব ধরণের সম্পাদকদের (সম্পাদনকে জানেন) itable কিন্তু সিএমকে দিয়ে আমি সমস্যাটি পেয়েছি যে একটি বিশাল রেখা এড়াতে কীভাবে একটি সরল স্ট্রিংকে একাধিক লাইনে বিভক্ত করতে হয় তা আমি জানি না। এই বেসিক কোডটি বিবেচনা করুন:

set(MYPROJ_VERSION_MAJOR "1")
set(MYPROJ_VERSION_MINOR "0")
set(MYPROJ_VERSION_PATCH "0")
set(MYPROJ_VERSION_EXTRA "rc1")
set(MYPROJ_VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}-${VERSION_EXTRA}")

এটি ইতিমধ্যে 80 লাইন সীমা ছাড় দেয়। তাহলে আমি কীভাবে সিএমকেতে এক লাইনটি ভার্বোস না পেয়ে (একাধিক list(APPEND ...)বা এর মতো) একাধিক লাইনে বিভক্ত করব ?

উত্তর:


90

সিএমকে 3.0 এবং আরও নতুনর জন্য আপডেট করুন :

লাইন ধারাবাহিকতা সঙ্গে সম্ভব \। দেখতে cmake -3.0-ডক

message("\
This is the first line of a quoted argument. \
In fact it is the only line but since it is long \
the source code uses line continuation.\
")

সিএমকে সংস্করণগুলির উপলব্ধতা:

ডেবিয়ান হুইজি (২০১৩): ২.৮.৯ ডিবান
হুইজি-ব্যাকপোর্টগুলি: ২.৮.১১ দেবিয়ান
জেসি (২০১৫): 3.0.2
উবুন্টু 14.04 (এলটিএস): 2.8.12
উবুন্টু 15.04: 3.0.2
ম্যাক ওএসএক্স: হোমব্রিউয়ের মাধ্যমে cmake-3 উপলব্ধ , Macports এবং Fink
উইন্ডোজ: cmake -3 মাধ্যমে উপলব্ধ Chocolatey


21
সিএমেকে 3.0.০ পদ্ধতির সাথে সমস্যা হ'ল এটি ইন্ডেন্টেশন উপেক্ষা করে না। যার অর্থ মাল্টি-লাইন স্ট্রিংগুলি বাকী কোডের সাথে ইন্টেন্ট করা যাবে না।
void.pointer

@ void.pointer আমিও একই সমস্যায় পড়েছি, আপনি কী বুঝতে পারেন কীভাবে মাল্টি-লাইনের সাথে ইনডেন্ট করবেন?
user3667089

এছাড়াও যদি ইন্ডেন্টেশন ব্যবহার করতে চান এবং 80 টি চর সীমা সীমাবদ্ধ থাকে তবে অন্য উপায়টি হ'ল: <কোড> বার্তা ("এটি ভেরিয়েবলের মান:" <br> "V {varValue}") </code>
মুনসিংহ

55

সিএমকে ৩.০ এবং আরও নতুন

string(CONCAT)কমান্ডটি ব্যবহার করুন :

set(MYPROJ_VERSION_MAJOR "1")
set(MYPROJ_VERSION_MINOR "0")
set(MYPROJ_VERSION_PATCH "0")
set(MYPROJ_VERSION_EXTRA "rc1")
string(CONCAT MYPROJ_VERSION "${MYPROJ_VERSION_MAJOR}"
                             ".${MYPROJ_VERSION_MINOR}"
                             ".${MYPROJ_VERSION_PATCH}"
                             "-${MYPROJ_VERSION_EXTRA}")

যদিও সিএমকে ৩.০ এবং উদ্ধৃত যুক্তিগুলির আরও নতুন সমর্থন লাইন ধারাবাহিকতা , আপনি আপনার স্ট্রিংয়ের অন্তর্ভুক্ত ইনডেন্টেশন হোয়াইটস্পেস না পেয়ে দ্বিতীয় বা পরবর্তী লাইনগুলি ইনডেন্ট করতে পারবেন না।

সিএমকে ২.৮ এবং তার বেশি বয়সী

আপনি একটি তালিকা ব্যবহার করতে পারেন। তালিকার প্রতিটি উপাদান একটি নতুন লাইনে রাখা যেতে পারে:

set(MYPROJ_VERSION_MAJOR "1")
set(MYPROJ_VERSION_MINOR "0")
set(MYPROJ_VERSION_PATCH "0")
set(MYPROJ_VERSION_EXTRA "rc1")
set(MYPROJ_VERSION_LIST "${MYPROJ_VERSION_MAJOR}"
                        ".${MYPROJ_VERSION_MINOR}"
                        ".${MYPROJ_VERSION_PATCH}"
                        "-${MYPROJ_VERSION_EXTRA}")

উদ্ধৃতি ব্যতীত ব্যবহৃত একটি তালিকা সাদা স্থান ব্যতীত সংক্ষিপ্ত করা হয়:

message(STATUS "Version: " ${MYPROJ_VERSION_LIST})
-- Version: 1.0.0-rc1

আপনার যদি সত্যিই স্ট্রিংয়ের প্রয়োজন হয় তবে আপনি তালিকাটি প্রথমে একটি স্ট্রিংয়ে রূপান্তর করতে পারেন:

string(REPLACE ";" "" MYPROJ_VERSION "${MYPROJ_VERSION_LIST}")
message(STATUS "Version: ${MYPROJ_VERSION}")
-- Version: 1.0.0-rc1

আপনার মূল স্ট্রিংয়ের যে কোনও অর্ধিকোলনগুলি তালিকা উপাদান বিভাজক হিসাবে দেখা যাবে এবং সরানো হবে। তাদের অবশ্যই পালাতে হবে:

set(MY_LIST "Hello World "
            "with a \;semicolon")

4
খুব দীর্ঘ লাইনের জন্য, পরিবর্তনশীল নামের পরে একটি নতুন লাইন এই ধরণটিকে আরও উন্নত করে (এই উদাহরণে অপ্রয়োজনীয়)।
ঋষি

কৌতূহলের বাইরে , অনুমান করা কি সঠিক হবে যে স্ট্রিংয়ের ডাবল উক্তিগুলিও একটি ব্যাকস্ল্যাশ দিয়ে পালানো দরকার, এবং সুতরাং কোনও স্ট্রাকস চরিত্র হিসাবে উপস্থিত হওয়ার জন্য যে কোনও ব্যাকস্ল্যাশগুলি দরকার?
জোনাথন লেফলার

@ জোনাথনলফলার হ্যাঁ, তাদের পালানোর দরকার হবে। ভাষার বিধিগুলি এখানে রয়েছে: cmake.org/cmake/help/latest/manual/… তবে এটি বিভ্রান্তিকর হয়। আরও দেখুন: স্ট্যাকওভারফ্লো.com
ডগলাস রয়ডস

9

এটি এখনও কিছুটা ভার্বোজ, তবে যদি 80 চর সীমাটি আপনাকে সত্যিই বাগিয়ে দেয় তবে আপনি বারবার একই ভেরিয়েবলটিতে যুক্ত করতে পারেন:

set(MYPROJ_VERSION_MAJOR "1")
set(MYPROJ_VERSION_MINOR "0")
set(MYPROJ_VERSION_PATCH "0")
set(MYPROJ_VERSION_EXTRA "rc1")
set(MYPROJ_VERSION "${MYPROJ_VERSION_MAJOR}.")
set(MYPROJ_VERSION "${MYPROJ_VERSION}${MYPROJ_VERSION_MINOR}.")
set(MYPROJ_VERSION "${MYPROJ_VERSION}${MYPROJ_VERSION_PATCH}-")
set(MYPROJ_VERSION "${MYPROJ_VERSION}${MYPROJ_VERSION_EXTRA}")
message(STATUS "version: ${MYPROJ_VERSION}")

আউটপুট দেয়:

$ cmake  ~/project/tmp
-- version: 1.0.0-rc1
-- Configuring done
-- Generating done
-- Build files have been written to: /home/rsanderson/build/temp

7

CMakeLists.txt ফাইলগুলিতে বা সিএমকে স্ক্রিপ্টগুলিতে একাধিক লাইনে স্ট্রিং আক্ষরিক বিভক্ত করার কোনও উপায় নেই। আপনি যদি একটি স্ট্রিংয়ের মধ্যে একটি নতুন লাইন অন্তর্ভুক্ত করেন তবে স্ট্রিংয়ের মধ্যেই একটি আক্ষরিক নিউলাইন থাকবে।

# Don't do this, it won't work, MYPROJ_VERSION will contain newline characters:
set(MYPROJ_VERSION "${VERSION_MAJOR}.
  ${VERSION_MINOR}.${VERSION_PATCH}-
  ${VERSION_EXTRA}")

যাইহোক, সিএমকে আর্গুমেন্টগুলি পৃথক করার জন্য হোয়াইটস্পেস ব্যবহার করে, যাতে আপনি আচরণ পরিবর্তন না করেই কোনও যুক্তি বিভাজক এমন একটি স্থানকে আপনার পছন্দ মতো নতুন লাইনে রূপান্তর করতে পারেন।

আপনি এই দীর্ঘ লাইনের পুনরায় বাক্য বলতে পারেন:

set(MYPROJ_VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}-${VERSION_EXTRA}")

এই দুটি ছোট লাইন হিসাবে:

set(MYPROJ_VERSION
  "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}-${VERSION_EXTRA}")

তারা সম্পূর্ণ সমতুল্য।


6

যারা এখানে থেকে আনা হয়েছিল তাদের জন্য আমি কীভাবে সিএমকে জেনারেটর এক্সপ্রেশনটিকে একাধিক লাইনে বিভক্ত করব? আমি কিছু নোট যুক্ত করতে চাই

লাইন ধারাবাহিকতা পদ্ধতিটি কাজ করবে না, সিএমকে হোয়াইটস্পেস (ইন্ডেন্টেশন) এবং লাইন ধারাবাহিকতায় তৈরি জেনারেটরের তালিকাকে পার্স করতে পারে না।

স্ট্রিং (কনক্যাট) সমাধান এমন একটি জেনারেটর এক্সপ্রেশন প্রদান করবে যা মূল্যায়ন করা যেতে পারে, যখন ফলাফলটিতে কোনও স্থান থাকে তবে মূল্যায়িত প্রকাশটি উদ্ধৃতি দ্বারা ঘিরে থাকবে।

প্রতিটি স্বতন্ত্র বিকল্প যুক্ত করার জন্য একটি পৃথক জেনারেটর তালিকা তৈরি করতে হবে, সুতরাং নীচের মতো করে করা স্ট্যাকিং বিকল্পগুলি বিল্ডটি ব্যর্থ করে দেবে:

string(CONCAT WARNING_OPTIONS "$<"
    "$<OR:"
        "$<CXX_COMPILER_ID:MSVC>,"
        "$<STREQUAL:${CMAKE_CXX_SIMULATE_ID},MSVC>"
    ">:"
    "/D_CRT_SECURE_NO_WARNINGS "
">$<"
    "$<AND:"
        "$<CXX_COMPILER_ID:Clang,GNU>,"
        "$<NOT:$<STREQUAL:${CMAKE_CXX_SIMULATE_ID},MSVC>>"
    ">:"
    "-Wall -Werror "
">$<"
    "$<CXX_COMPILER_ID:GNU>:"
    "-Wno-multichar -Wno-sign-compare "
">")
add_compile_options(${WARNING_OPTIONS})

এর কারণ, ফলাফলগুলি বিকল্পগুলিকে উদ্ধৃতিগুলিতে সংকলককে দেওয়া হয়

/usr/lib64/ccache/c++  -DGTEST_CREATE_SHARED_LIBRARY=1 -Dgtest_EXPORTS -I../ThirdParty/googletest/googletest/include -I../ThirdParty/googletest/googletest -std=c++11 -fno-rtti -fno-exceptions -fPIC    -std=c++11 -fno-rtti -fno-exceptions -Wall -Wshadow -DGTEST_HAS_PTHREAD=1 -fexceptions -Wextra -Wno-unused-parameter -Wno-missing-field-initializers "-Wall -Werror -Wno-multichar -Wno-sign-compare " -fdiagnostics-color -MD -MT ThirdParty/googletest/googletest/CMakeFiles/gtest.dir/src/gtest-all.cc.o -MF ThirdParty/googletest/googletest/CMakeFiles/gtest.dir/src/gtest-all.cc.o.d -o ThirdParty/googletest/googletest/CMakeFiles/gtest.dir/src/gtest-all.cc.o -c ../ThirdParty/googletest/googletest/src/gtest-all.cc
c++: error: unrecognized command line option ‘-Wall -Werror -Wno-multichar -Wno-sign-compare ’

স্ট্রিং (CONCAT) সমাধান ব্যবহার করে প্রতিনিধিত্ব করা দীর্ঘ জেনারেটর এক্সপ্রেশন মূল্যায়নের জন্য, প্রতিটি জেনারেটর এক্সপ্রেশনকে কোনও ফাঁকা জায়গা ছাড়াই একক বিকল্পে মূল্যায়ন করতে হবে:

string(CONCAT WALL "$<"
    "$<AND:"
        "$<CXX_COMPILER_ID:Clang,GNU>,"
        "$<NOT:$<STREQUAL:${CMAKE_CXX_SIMULATE_ID},MSVC>>"
    ">:"
    "-Wall"
">")
string(CONCAT WERROR "$<"
    "$<AND:"
        "$<CXX_COMPILER_ID:Clang,GNU>,"
        "$<NOT:$<STREQUAL:${CMAKE_CXX_SIMULATE_ID},MSVC>>"
    ">:"
    "-Werror"
">")
message(STATUS "Warning Options: " ${WALL} ${WERROR})
add_compile_options(${WALL} ${WERROR})

এটি যে প্রশ্নের উত্তর আমি পোস্ট করছি তার সাথে এটি সম্পর্কিত নয়, দুর্ভাগ্যক্রমে আমি যে প্রশ্নের উত্তর দিচ্ছি তা এই প্রশ্নের সদৃশ হিসাবে ভুলভাবে চিহ্নিত হয়েছে।

জেনারেটর তালিকাগুলি স্ট্রিংগুলির মতো হ্যান্ডল করা এবং পার্স করা হয় না এবং এর কারণে, একাধিক লাইনে জেনারেটরের তালিকাকে বিভক্ত করার জন্য অতিরিক্ত ব্যবস্থা গ্রহণ করতে হবে।


লিঙ্কযুক্ত "নকল" এ এই উত্তরের একটি সংস্করণ পোস্ট করা সম্ভবত সার্থক হবে। আমি যখন এটি পেরিয়ে এসেছি তখন এই উত্তরটি আমি খুঁজছিলাম।
কেইথ 13

5

মূল প্রশ্নের উদাহরণটি কেবল একটি অপেক্ষাকৃত ছোট স্ট্রিং সম্পর্কে। দীর্ঘতর স্ট্রিংগুলির জন্য (অন্যান্য উত্তরগুলিতে প্রদত্ত উদাহরণ সহ), বন্ধনী যুক্তি আরও ভাল হতে পারে। ডকুমেন্টেশন থেকে:

একটি শুরুর বন্ধনী [শূন্য বা তার =পরে আরও কিছু পরে লেখা হয় [। সংশ্লিষ্ট বন্ধের বন্ধনীটি ]পরে একই সংখ্যায় =অনুসরণ করা হয় ]। বন্ধনী বাসা বাঁধে না। অন্যান্য দৈর্ঘ্যের বন্ধনী বন্ধনী ধারণের জন্য বন্ধন শুরুর জন্য এবং বন্ধ করার জন্য একটি অনন্য দৈর্ঘ্য সর্বদা চয়ন করা যেতে পারে।

[...]

উদাহরণ স্বরূপ:

message([=[
This is the first line in a bracket argument with bracket length 1.
No \-escape sequences or ${variable} references are evaluated.
This is always one argument even though it contains a ; character.
The text does not end on a closing bracket of length 0 like ]].
It does end in a closing bracket of length 1.
]=])```

যদি আমি এটি সঠিকভাবে বুঝতে পারি তবে উত্সের একটি লাইনব্রেক স্ট্রিংয়ের মধ্যে একটি লাইনব্রেকও প্রবর্তন করবে। উদাহরণস্বরূপ, "দৈর্ঘ্য 1" এর পরে একটি \ n থাকবে। কোন উপায় এড়াতে?
লুকাস শ্মেলজেইসেন

এটি সঠিক, \nএস হবে। আপনি যদি তা না চান তবে আমি মনে করি না বন্ধনী যুক্তিগুলিই আপনার সমাধান।
ingomueller.net

বিটিডাব্লু, এটি ৩.x সংস্করণের জন্য বৈধ, ২.x নয়
ম্যাক্সিম সুস্লোভ

3

আপনার কোডে ভাল ইন্ডেন্টেশন বজায় রাখার জন্য এটি কেবল যথেষ্ট কাজ সোজা

message("These strings " "will all be "
        "concatenated. Don't forget "
        "your trailing spaces!")

অথবা সরাসরি একটি স্ট্রিং গঠন

string(CONCAT MYSTR "This and " "that "
                    "and me too!")

ডগলাসের উত্তর হিসাবে যেমন আরও বিশদ আছে। তবে আমি ভেবেছিলাম এটি সম্ভবত প্রয়োজনীয় বিষয়টির সংক্ষিপ্তসার করতে পারে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.