相当于C编程语法#定义;茱莉亚语

相当于C编程语法#定义;茱莉亚语,c,julia,compile-time-constant,C,Julia,Compile Time Constant,在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; }

在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;
}

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

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

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

macro AGE()
    return :(10)
end
在Julia REPL中,键入
@NAME
将返回
“Jack”

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

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文档(当前稳定版本:0.6.2)中提出的论点是,它有时可能会降低性能。但是,想象一下,如果一个常量用于分布在20个模块中的100个函数,您是更愿意将同一行代码编写100次并仔细检查模块之间的数字是否一致,还是只定义一次并在所有位置使用它?我认为正确使用全局常量可以使代码干净且易于维护,而这种担心往往会压倒性能的微小提升。

没有确切的等价物,但您可以使用
const
?我是否每次都需要在函数输入参数中使用变量?不,函数可以访问全局范围中的(const)变量,我所需要的只是快速搜索文档。我从来没有在茱莉亚写过程序。我不想听起来像是居高临下,但下次请你自己先做。
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
macro NAME()
    return :("Jack")
end

const name = "Jack"

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

function f_hello_macro()
    println("Hello ", (@NAME))
end
julia> @code_llvm f_hello_global()
. . . 

julia> @code_llvm f_hello_macro()
. . .