【问题标题】:Equivalent of C programming syntax "#define" in Julia language等效于 Julia 语言中的 C 编程语法“#define”
【发布时间】:2017-08-13 18:40:06
【问题描述】:

在 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

【问题讨论】:

  • 没有确切的等价物,但您可以改用const
  • 是否每次都需要在函数输入参数中使用变量?
  • 不,函数可以访问全局范围内的 (const) 变量
  • 我所需要的只是快速搜索文档。我从未在 Julia 中编程过。我不想听起来居高临下,但请下次尝试自己先做。

标签: c julia compile-time-constant


【解决方案1】:

可以在 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 次并煞费苦心地检查模块之间的数字是否一致,还是您会定义一次并全部使用它地方?我认为正确使用全局常量可以使代码干净且易于维护,而这种担忧往往胜过性能上的小幅提升。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-07
      • 1970-01-01
      • 2022-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多