2016-05-19 23 views
7

Aşağıdaki programa bakınız. Bu programda Gerçek argümanı 'const int' olarak tanımlamak tamam mı, yoksa sadece başlıkta sadece 'int' olarak mı belirtiyorsunuz?

#include <stdio.h> 

void f(int a); 

int main() 
{ 
    f(10); 
    return 0; 
} 

void f(const int a) 
{ 
    /* a = 20; */ /* Want to avoid accidental modification of a. */ 
    printf("%d\n", a); 
} 

fonksiyonunun f() beyanı

tam tanımını eşleşmiyor. Beyanda parametre olarak int a var, ancak tanım parametre olarak const int a'a sahip.

Bu program hakkında sorularım var.

  1. Ben f() çağıran kod gerçek argüman af() içinde sabit olarak kabul edilir olmadığını bilmek zorunda değildir, çünkü bu tamam inanıyoruz. Bu detay biraz f()'a özeldir. Bu, arama kodunun endişelerinden hiçbiri değil. Arayan söz konusu olduğunda, int a ile ilgili hiçbir şey, her iki durumda da f() numaralı telefonu ararken değişebilir. Ben haklı mıyım
  2. İşlev tanımlarındaki gerçek bağımsız değişkenleri const int veya const char *const olarak bildirmek, ancak yalnızca başlıkta yalnızca int veya const char * olarak bildirmek yaygın mıdır? Eğer değilse, bu yolu tavsiye eder misiniz? Bu ikinci soru hedefini devam ettirmek için lütfen bunu yapmanın artılarını ve eksilerini listeleyin.
+4

Hayır, gerçekten sorun değil. Bu bir uyarı vermelidir, çünkü uygulama bildiriden farklıdır. –

+1

@MichaelWalz: Ne Clang ne de GCC bu konuda bir uyarı veriyor, hatta -std = c11 -pedantic -Wamp -Wextra'da bile. –

+1

@MichaelWalz Anladığım kadarıyla, 'f (const int a)' ve 'f (int a)', arayanla aynı şeyi ifade eder, yani her iki durumda da 'f()', 'a' ile ilgili hiçbir şeyi değiştiremez. arayan kişi görebilir. Ayrıca, gcc -Wallra -pedantic -std = c99 foo.c' ile derledim. Hiçbir uyarı yapılmadı. –

cevap

8

senin işlevi bunu yaparsanız daha kararlı (ve serseri üstlenmeden karşı daha az kırılgan) 'dir anlaşılacağı düşünce bir okul olmadığı için evlerin fonksiyonu işaretleme ısrar Bazı yazılım const mümkünse parametreleri istemeden değiştiremezsiniz çünkü o bir giriş parametresi.

C standardı, bir işlev bildiriminde const parametrelerini ve tanımda const kullanmanıza izin verir.

Şahsen benim prototiplerimin tanımlarıma uymasını istediğim gibi yapmıyorum. Kod analiz paketlerini de karıştırdığını düşünürdüm.

+0

C standardında, bildirimde “const” parametresi olmayan ve 'const 'tanımına izin veren bölüme işaret edebilir misiniz? Grzegorz Szpetkowski'nin diğer cevabı bu iddiayla çelişiyor gibi görünüyor. Bu iddiayı C standardına referanslarla kanıtlayabilirsek çok güzel olur. –

+0

@LoneLearner: Cevabımı sildim çünkü bu konuda yanlıştı. Daha spesifik olarak, 6.7.6.3/15'i özledim, bu da temel olarak 'const' niteleyicisinin uyumluluğu gidermek için düştüğünü anlatıyor. –

+0

@GrzegorzSzpetkowski Muhtemelen cevabınızı geri almalı ve düzeltmek için güncellemeniz gerekir. Cevabınız, bu soruyu yeterli kanıtla cevaplamaya yardımcı olacak C standardı için gerçekten yararlı referanslara sahipti. –

İlgili konular