[英]How to declare and define a pure function in gcc?
GCC具有pure和const屬性,其中const實際上用於真正的純函數(純函數是冪等函數,也是無副作用的 )。
那么如何使用const-attribute聲明和定義一個函數呢?
編輯:我對真正的純函數感興趣,使用const屬性聲明的函數,而不是使用pure-attribute聲明的函數。
例:
// 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
。
根據這篇文章 ,語法與@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
從C ++ 11開始,可以使用屬性說明符序列來指定這些屬性。 例如:
[[ gnu::const ]]
int square (int x)
{
return x * x;
}
此外,從C ++ 17開始,將忽略編譯器未知的所有屬性,而不會導致錯誤。 因此,上面的代碼可以在不同的編譯器和平台之間移植。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.