簡體   English   中英

如何在gcc中聲明和定義純函數?

[英]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

但是constpure屬性只有在應用於外部聲明時才有用,所以這應該不是問題。 如果定義是可見的,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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM