等价于 Julia 语言中的 C 编程语法“#define”

Equivalent of C programming syntax "#define" in Julia language

在 C 编程语言中,#define 指令允许在源代码中定义宏。这些宏定义允许声明常量值以在整个代码中使用。

宏定义不是变量,不能像变量一样被程序代码改变。我们通常在创建表示数字、字符串或表达式的常量时使用此语法。 像这样

#include <stdio.h>

#define NAME "Jack"
#define AGE 10

int main()
{
   printf("%s is over %d years old.\n", NAME, AGE);
   return 0;
}

美妙之处在于,如果我的代码中有多个函数,我不需要输入常量变量到每个函数中,编译器只需将定义的表达式替换为进行价。

现在我的问题是:在 Julia 编程中是否有与此等效的命令?

例如

density = 1 # somehow a defined variabe.
function bar(g)
    t =  density +g
end
function foo()
     r = dencity + 2
end 

main()
   g = 10;
   foo()
   bar(g)
end

感谢所有回答我的人。 我发现 globalconst 关键字可以帮助我做这些事情,但是使用它们有一些性能限制,即 Julia 对全局变量的类型定义和类型识别。 尽管您可以使用 constglobal 使变量在全局范围内可见,但在 Julia 文档中不推荐这样做。

可以在 Julia 中使用 macro 模拟 C #define 行为。

macro NAME()
    return :("Jack")
end

macro AGE()
    return :(10)
end

在 Julia REPL 中,键入 @NAME 将 return "Jack".

julia> @NAME
"Jack"

julia> @AGE
10

为了安全起见,请记住将宏调用括在括号中,例如,

julia> println("Hello ", (@NAME))
Hello Jack

julia> println(@NAME * " is " * repr(@AGE) * " years old")
ERROR: syntax: "*" is not a unary operator

julia> println((@NAME) * " is " * repr(@AGE) * " years old")
Jack is 10 years old

但这真的有必要吗? Julia 中惯用的方式是定义全局 const 变量。尽管文档出于性能原因不鼓励使用全局变量,但像这样的宏对性能没有帮助,您可以从 LLVM 代码中看出。

macro NAME()
    return :("Jack")
end

const name = "Jack"

function f_hello_global()
    println("Hello ", name)
end

function f_hello_macro()
    println("Hello ", (@NAME))
end

对于这些微不足道的函数,您会发现 LLVM 代码看起来完全一样(太长;此处未显示)。

julia> @code_llvm f_hello_global()
. . . 

julia> @code_llvm f_hello_macro()
. . .

编辑:顺便说一句,我认为如果您需要使用全局变量,那么就使用它。 Julia 文档(当前稳定版本:0.6.2)中的论点是它有时可能会降低性能。然而,想象一下,如果一个常量用于分布在 20 个模块中的 100 个函数中,您是愿意将同一行代码编写 100 次并煞费苦心地检查各个模块中的数字是否一致,还是您会定义一次并在所有模块中使用它地方?我认为正确使用全局常量可以使代码干净且易于维护,这种担忧往往会战胜性能上的小幅提升。