【CMake入門・応用編(11)】CMakeマクロ定義と関数(コード付き)

        Cmake はマクロを定義する方法を提供します。cmake の関数関数はマクロ定義マクロとある程度同じです。両方とも、後で呼び出すことができる名前を持つコードを作成し、パラメーターを渡します。マクロは、次のように、macro() コマンドによって定義されます。

macro(<name> [arg1 [arg2 [arg3 ...]]])
    COMMAND1(ARGS ...)
    COMMAND2(ARGS ...)
    ...
endmacro(<name>)

        終了マクロ括弧内に書き込み可能なものは書き込めない可能性があります。記述する場合は、マクロ括弧と一致している必要があります。パラメータ名はマクロ定義の名前を示しますが、マクロ定義では先ほど紹介した変数ARGVX(Xは数字)、ARGC、ARGV、ARGNも使用できるので、これらもマクロ定義の内部変数となり、以下に示すように:

# macro 宏定义测试
macro(XYZ arg1 arg2)
    message("ARGC: ${ARGC}")
    message("ARGV: ${ARGV}")
    message("ARGN: ${ARGN}")
    message("ARGV0: ${ARGV0}")
    message("ARGV1: ${ARGV1}")

    # 循环打印出各个参数
    set(i 0)
    foreach(loop ${ARGV})
        message("arg${i}: " ${loop})
        math(EXPR i "${i} + 1")
    endforeach()
endmacro()

# 使用宏
XYZ(A B C D E)

        ソースコードの印刷情報は次のとおりです。

         定義から見ると、それらはまったく同じであるように見えます。マクロと関数は確かに似ていますが、それでも違いがあります。たとえば、ARGV、ARGC、ARGN などのマクロのパラメーターと値は、通常の CMake の意味では変数ではありませんこれらは文字列置換です。C 言語プリプロセッサがマクロに対して行うのと同様、次のものは使用できません。

if(ARGV1) # ARGV1 is not a variable
if(DEFINED ARGV2) # ARGV2 is not a variable
if(ARGC GREATER 2) # ARGC is not a variable
foreach(loop_var IN LISTS ARGN) # ARGN is not a variable

        マクロ定義では、マクロのパラメーターと ARGC、ARGV、ARGN などの値は変数ではなく、文字列置換であるため、cmake がマクロ定義を実行するときに、最初にマクロのパラメータをARGC、ARGV、ARGNと組み合わせ、その他の値が文字列に置き換えられてからこのマクロが実行されます。これは実際にはC言語の前処理ステップに似ており、関数とは異なります。テストしてみましょう:

# macro 宏
macro(abc arg1 arg2)
    if(DEFINED ARGC)
        message(true)
    else()
        message(false)
    endif()
endmacro()

# function 函数
function(xyz arg1 arg2)
    if(DEFINED ARGC)
        message(true)
    else()
        message(false)
    endif()
endfunction()

# 调用宏
abc(A B C D)

# 调用函数
xyz(A B C D)

         上記のコードでは、マクロ abc と関数 xyz を定義しています。両方のコードは同じです。両方とも内部で if() を使用して ARGC が変数かどうかを判断します。true の場合は、true を出力します。そうでない場合は false が出力され、マクロ abc と関数 xyz がそれぞれ呼び出され、出力される情報は次のとおりです。

        出力された情報から、マクロ定義では ARGC が変数ではないことがわかります。実際には、以下に示すように、ARGC はマクロが実行される前に置き換えられます。

if(DEFINED 4)
    message(true)
else()
    message(false)
endif()

        ARGC を 4 に置き換えます (実際には 4 つの引数を渡したため)。もちろん、これに加えて、cmake の関数とマクロ定義の間には他にも違いがあります。たとえば、関数には独自のスコープがありますが、マクロ定義にはスコープの概念がありません。

おすすめ

転載: blog.csdn.net/cj_lsk/article/details/131300325