ম্যাক্রো সম্প্রসারণ, Yantao জাই উত্তর সত্যিই আমার চোখ খোলে!
আমি নীচে টিউটোরিয়ালটি কিছু কংক্রিট উদাহরণ সহ দেখতে পেয়েছি যা ভেরিয়েবল স্কোপ ধারণাটি বুঝতে সহায়তা করে।
15 মিনিটের মধ্যে শিখুন সিএমকে থেকে উদ্ধৃত :
সিএমকেতে, আপনি কোনও ক্রিয়া সংজ্ঞায়িত করতে একজোড়া function/ endfunctionকমান্ড ব্যবহার করতে পারেন । এখানে এমন একটি যা তার যুক্তির সংখ্যার মানকে দ্বিগুণ করে, তারপরে ফলাফলটি মুদ্রণ করে:
function(doubleIt VALUE)
math(EXPR RESULT "${VALUE} * 2")
message("${RESULT}")
endfunction()
doubleIt("4") # Prints: 8
ফাংশনগুলি তাদের নিজস্ব স্কোপে চলে। কোনও ফাংশনে সংজ্ঞায়িত কোন ভেরিয়েবল কলারের সুযোগকে দূষিত করে না। যদি আপনি কোনও মান ফিরিয়ে দিতে চান তবে আপনি কোনও ভেরিয়েবলের নামটি আপনার ফাংশনে প্রেরণ করতে পারেন, তারপরে setবিশেষ যুক্তি দিয়ে কমান্ডটি কল করুন PARENT_SCOPE:
function(doubleIt VARNAME VALUE)
math(EXPR RESULT "${VALUE} * 2")
set(${VARNAME} "${RESULT}" PARENT_SCOPE) # Set the named variable in caller's scope
endfunction()
doubleIt(RESULT "4") # Tell the function to set the variable named RESULT
message("${RESULT}") # Prints: 8
একইভাবে, একজোড়া macro/ endmacroকমান্ড ম্যাক্রো সংজ্ঞা দেয়। ফাংশনগুলির বিপরীতে, ম্যাক্রোগুলি তাদের কলারের মতো একই স্কোপে চলে। সুতরাং, ম্যাক্রোর অভ্যন্তরে সংজ্ঞায়িত সমস্ত ভেরিয়েবলগুলি কলারের স্কোপে সেট করা থাকে। আমরা নিম্নলিখিত ফাংশন প্রতিস্থাপন করতে পারেন:
macro(doubleIt VARNAME VALUE)
math(EXPR ${VARNAME} "${VALUE} * 2") # Set the named variable in caller's scope
endmacro()
doubleIt(RESULT "4") # Tell the macro to set the variable named RESULT
message("${RESULT}") # Prints: 8
উভয় ফাংশন এবং ম্যাক্রোগুলি একটি স্বেচ্ছাসেবী যুক্তি স্বীকার করে। নামহীন আর্গুমেন্টগুলি একটি বিশেষ ভেরিয়েবলের মাধ্যমে তালিকা হিসাবে ফাংশনটির কাছে প্রকাশিত হয় ARGN।
এখানে একটি ফাংশন যা এটি প্রাপ্ত প্রতিটি আর্গুমেন্টকে দ্বিগুণ করে প্রতিটি পৃথক লাইনে মুদ্রণ করে:
function(doubleEach)
foreach(ARG ${ARGN}) # Iterate over each argument
math(EXPR N "${ARG} * 2") # Double ARG's numeric value; store result in N
message("${N}") # Print N
endforeach()
endfunction()
doubleEach(5 6 7 8) # Prints 10, 12, 14, 16 on separate lines
functionএবংmacroএর শব্দার্থবিদ্যা:return()যখন একটি ব্যবহৃত:macro, আপনি ম্যাক্রো থেকে কিন্তু কলিং ফাংশন থেকে ফিরে করা হবে না।