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