這個問題在這里已經有了答案: 函式引數使用 'const' (31個答案) 4天前關閉。
是否有任何理由使用“void fun(void *const ptr)”?或者'ptr'總是副本?或者它可能有助于優化編譯的代碼?目前我只能看到它阻止任何指標算術作為 ptr ir 只讀。(void 可以用任何其他型別替換)
void fun(void * const param);
vs
void fun(void * param);
uj5u.com熱心網友回復:
物件(即非參考)引數的常量很重要,并且取決于背景關系無關緊要。兩個示例都宣告了相同的函式,因此在這方面引數的常量性被忽略。
這同樣適用于指標和非指標。這些集合分別宣告了一個函式:
void foo(int);
void foo(int const); // const normally applies to left
void foo(const int); // const is first token of type, so it applies to right
void bar(T*);
void bar(T* const);
void baz(T const *);
void baz(T const * const);
void baz(const T *);
void baz(const T * const);
請注意,這T const *不是 const 限定的T *。它是一個非常量限定型別;指向 const T 的非常量指標。
但是如果在函式定義中將引數宣告為 const,則不能修改引數。所以,在這種情況下,常量很重要。引數是否被修改與呼叫者無關,因為引數是呼叫者無法訪問的引數的副本。例子:
void foo(int x) {
x ; // OK
void foo(int const) {
x ; // Not OK
或者'ptr'總是副本?
是的。物件(即非參考)引數始終是一個副本。在某些情況下,優化器可能會在效率更高時忽略該副本。
或者它可能有助于優化編譯的代碼?
不太可能。
目前我只能看到它阻止了任何指標算術
常量不會阻止指標算術。例子:
void fun(T* const param) {
T* next = param 1;
void*除非您轉換為另一種指標型別,否則存在確實會阻止指標算術。
uj5u.com熱心網友回復:
void fun(void * const param);
C中的引數本質上與區域變數相同,只是由呼叫者初始化。制作引數(或就此而言的區域非靜態變數)const可防止程式員意外撰寫更改此“區域變數”指向的代碼。
但在實踐中,這不是程式員遇到的問題,它不是細微錯誤的來源,因此在實踐中并沒有增加太多價值。此外,編譯器足夠聰明,可以知道如果您根本不撰寫代碼就不會更改區域變數,因此它也不會啟用任何額外的優化。
結論:添加 const 是無用的混亂,不要這樣做。但這只是意見,有人可能出于多種原因不同意。
注意:不要與指向 const 的指標相混淆,如果您沒有特定理由不這樣做,您應該使用它:
void fun(const void *param);
uj5u.com熱心網友回復:
“void * const ptr”對函式引數有影響嗎?
const在決議函式呼叫時,像,這樣的頂級限定符volatile會被簡單地忽略。也就是說,在多載決議期間const,示例引數中使用的頂層param無關緊要。那就是頂層const不會改變函式的簽名。
void fun(void * const param); // first declaration
void fun(void * param); // re-declaration of the same function above
但是在選擇了合適的函式之后(使用函式多載),在情況 1( void * const param) 中,param不能在函式體內修改引數,而在情況 2( void * param) 中,沒有什么可以阻止您param通過分配給它進行修改。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/483997.html
上一篇:將陣列的地址傳遞給C 中的函式
下一篇:函式的屬性回傳到陣列
