相当于 Julia 语言中的 C 编程语法"#define"



在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

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

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

在 Julia REPL 中,键入@NAME将返回"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 次并煞费苦心地检查模块之间的数字是否一致,或者您会定义一次并在所有地方使用它?我认为正确使用全局常量会使代码干净且易于维护,并且这种关注通常胜过性能的小幅提高。

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

最新更新