Fortran的参数语句是否类似于C / C ++的#define语句?

时间:2015-12-14 20:34:05

标签: c++ c fortran

我是Fortran的新手,但我认为Fortran的parameter类似于在C / C ++中使用#define。它们相似吗?它们是否以相同的方式使用?我知道#define是一个预处理程序语句,我不确定这可能导致#defineparameter有什么相似之处或不同之处。

4 个答案:

答案 0 :(得分:5)

parameter更类似于C / C ++中的const声明。这是一个不变的表达。

要在Fortran中获取预处理器,您可以考虑在Fortran代码上使用.F扩展或强制C预处理器

答案 1 :(得分:5)

正如其他答案中的许多细节所述,具有parameter属性的对象是命名常量。此属性可以在声明中指定,例如在Alexander Vogt给出的examples中或使用parameter语句。

如果预处理用作#define,例如

#define int_literal 1

然后,正如其他地方所述,在预处理阶段有文本级替换,因此我们得到的是文字常量

现在,为什么这种区别很重要?也就是说,两个片段之间是否有任何真正的区别

#define nx 100
real x(nx)

integer, parameter :: nx=100
real x(nx)

不是很多,有人可能会想。但是,请考虑

integer, parameter :: hello(*) = [1,2,3]
type(some_type), parameter :: tp = some_type(4,5,6)

我们很难找到合适的#define,它们可以让我们做任何我们想要的事情,好像我们有那些命名的常量。对于那些命名常量,我们可以使用

之类的东西
print *, hello(2)-PRODUCT(hello(1::2)), tp%b   ! For b one of the components.

也就是说,命名常量是数据对象,可以通过文本文本替换以异乎寻常的方式进行操作。

对于真正的病理学,请考虑愚蠢的例子

#define x 2.1
print *, 1/x

integer, parameter :: x=2.1
print *, 1/x 

为了完整性,参数语句的一个例子是

integer i
parameter (i=1)

答案 2 :(得分:4)

$(document).ready(function() { var max_fields = 10; //maximum input boxes allowed var wrapper = $(".input_fields_wrap"); //Fields wrapper var add_button = $(".add_field_button"); //Add button ID var x = 1; //initial text box count $(add_button).click(function(e){ //on add input button click e.preventDefault(); if(x <= max_fields){ //max input box allowed $(wrapper).append('<div><input type="text" name="myText' + x + '"/><a href="#" class="remove_field">Remove</a></div>'); //add input box x++; //text box increment } }); $(wrapper).on("click",".remove_field", function(e){ //user click on remove text e.preventDefault(); $(this).parent('div').remove(); x--; }) }); </script> 是用于定义宏的预处理器语句。在预处理步骤中,宏被它们的值替换。请注意,预处理器语句不是Fortran标准的一部分。并非每个编译器都支持它们

另一方面,#define表示一个命名常量(类似于C构造parameter)。任何变量类型都可用于声明常量。此常量在编译时定义:

const

答案 3 :(得分:2)

PARAMETER确实是一个给你起名的常数值。

#define预处理器命令具有更广泛和更强大的目标:它将字符串替换为程序文本中出现的另一个字符串。替换字符串可以是任何代码片段。这是一种让程序自行修改的方法(就在编译之前)。

例如

#define Operator +
S= 1 Operator 2 Operator 3;

相当于

S= 1 + 2 + 3;

您可以轻松转向

S= 1 - 5 * 2 - 5 * 3;

如果这是有道理的。

不可否认,通过宏定义常量参数是一种旧用法,

#define DAYS_PER_WEEK 5
#define PI 22/7

尽管编译器没有良心认为它们是参数,但它们仍然是纯文本。在此示例中,1/PI1/22/7,其评估为1/154,而不是7/22