在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 次并煞费苦心地检查模块之间的数字是否一致,或者您会定义一次并在所有地方使用它?我认为正确使用全局常量会使代码干净且易于维护,并且这种关注通常胜过性能的小幅提高。
感谢所有回答我的人。 我发现global
和const
关键字可以帮助我做这些事情,但是使用它们有一些性能限制,即Julia对全局变量的类型定义和类型识别。 尽管您可以使用const
和global
使变量在全局范围内可见,但不建议在 Julia 文档中这样做。