GCC具有pure和const属性,其中const实际用于真正的纯函数(纯粹用于idempotent functions which are also side-effect free)。
那么如何使用const-attribute声明和定义函数?
编辑:我对真正的纯函数感兴趣,用const-attribute声明的函数,而不是用pure-attribute声明的函数。
答案 0 :(得分:6)
示例:
// Declaration:
int square (int x) __attribute__ ((const));
// Definition:
int __attribute__ ((const)) square (int x)
{
return x*x;
}
所有属性的语法几乎相同:__attribute__ (( <attribute-name> ))
或__attribute__ (( <attribute-name> ( <attribute-options> ) ))
。引用您链接到的文档:
关键字
__attribute__
允许您在进行声明时指定特殊属性。此关键字之后是双括号内的属性规范。
您链接到的文档中有一些示例可用于其他几个属性,包括pure
:
int square (int) __attribute__ ((pure));
所以,从语法角度来看,使用const
所需要的只是将pure
更改为const
:
int square (int) __attribute__ ((const));
正如评论中所指出的:如果您在定义中使用它,那么您需要将__attribute__ ((const))
放在不同的位置:
int square (int) __attribute__ ((const)) { ... } // doesn't work
int __attribute__ ((const)) square (int) { ... } // does work
但const
和pure
属性只有在应用于外部声明时才有用,所以这不应该是个问题。如果定义可见,GCC通常能够确定在没有您帮助的情况下是否可以将该功能视为const
/ pure
。
答案 1 :(得分:5)
根据此this article,语法与@hvd所说的匹配:
int square (int) __attribute__ ((pure));
但是,在编译以下示例时,gcc
似乎没有强制执行不检查全局状态的属性。
#include <stdio.h>
int square (int) __attribute__ ((pure));
int outerX = 7;
int square(int x) {
return outerX * x;
}
int main(){
printf("%d\n", square(5));
return 0;
}
以下打印没有错误,代码运行并生成35
。
gcc -Wall -Werror -pedantic -O3 Pure.c
gcc --version
gcc (Ubuntu/Linaro 4.8.1-10ubuntu9) 4.8.1
更奇怪的是,gcc
也不关心我们是否改变函数内部的全局状态,并且因为它在全局状态中引起的更改而在每次调用时返回不同的值。
#include <stdio.h>
int square (int) __attribute__ ((pure));
int outerX = 7;
int square(int x) {
outerX++;
return outerX * x;
}
int main(){
printf("%d\n", square(5));
printf("%d\n", square(5));
printf("%d\n", square(5));
return 0;
}
输出:
40
45
50
答案 2 :(得分:1)
从C ++ 11开始,可以使用Apache Beam programming guide来指定这些属性。例如:
[[ gnu::const ]]
int square (int x)
{
return x * x;
}
此外,从C ++ 17开始,将忽略编译器未知的所有属性,而不会导致错误。因此,上面的代码可以在不同的编译器和平台之间移植。