Sự khác biệt giữa static const
và là const
gì? Ví dụ:
static const int a=5;
const int i=5;
Có sự khác biệt nào giữa chúng không? Khi nào bạn sử dụng cái này thay cho cái kia?
Sự khác biệt giữa static const
và là const
gì? Ví dụ:
static const int a=5;
const int i=5;
Có sự khác biệt nào giữa chúng không? Khi nào bạn sử dụng cái này thay cho cái kia?
Câu trả lời:
Sự khác biệt là sự liên kết.
// At file scope
static const int a=5; // internal linkage
const int i=5; // external linkage
Nếu i
đối tượng không được sử dụng bên ngoài đơn vị dịch nơi nó được định nghĩa, bạn nên khai báo nó với trình static
xác định.
Điều này cho phép trình biên dịch (có khả năng) thực hiện tối ưu hóa hơn nữa và thông báo cho người đọc rằng đối tượng không được sử dụng bên ngoài đơn vị dịch của nó.
const int i = 5;
có liên kết bên ngoài ?? Trong C ++ nó không ...
const
không liên quan gì đến C ++ const
.
static
xác định khả năng hiển thị bên ngoài của một hàm hoặc tuổi thọ của các biến bên trong. Vì vậy, nó không có gì để làm với const
per se.
const
nghĩa là bạn không thay đổi giá trị sau khi nó đã được khởi tạo.
static
bên trong một hàm nghĩa là biến sẽ tồn tại trước và sau khi hàm kết thúc.
static
bên ngoài một chức năng có nghĩa là phạm vi của ký hiệu được đánh dấu static
được giới hạn trong tệp .c đó và không thể nhìn thấy bên ngoài nó.
Về mặt kỹ thuật (nếu bạn muốn tra cứu điều này), static
là một định nghĩa lưu trữ và const
là một định nghĩa loại.
const int i = 5;
i giá trị bạn có thể sửa đổi bằng cách sử dụng một con trỏ nếu tôi được định nghĩa và khai báo cục bộ, nếu nó là static const int a = 5; hoặc const int i = 5; trên toàn cầu, bạn không thể sửa đổi vì nó được lưu trữ trong bộ nhớ RO trong Phân đoạn dữ liệu.
#include <stdio.h>
//const int a=10; /* can not modify */
int main(void) {
// your code goes here
//static const int const a=10; /* can not modify */
const int a=10;
int *const ptr=&a;
*ptr=18;
printf("The val a is %d",a);
return 0;
}
Nó phụ thuộc vào việc các định nghĩa này có nằm bên trong một hàm hay không. Câu trả lời cho trường hợp bên ngoài một hàm được đưa ra bởi ouah, ở trên. Bên trong của một chức năng, hiệu ứng là khác nhau, được minh họa bằng ví dụ dưới đây:
#include <stdlib.h>
void my_function() {
const int foo = rand(); // Perfectly OK!
static const int bar = rand(); // Compile time error.
}
Nếu bạn muốn một biến cục bộ là "thực sự không đổi", bạn phải xác định nó không chỉ là "const" mà còn là "static const".
foo
biến được khởi tạo lại mỗi lần my_function()
được gọi, dẫn đến một giá trị ngẫu nhiên khác được gán. Trong trường hợp bar
biến chỉ được khởi tạo một lần, lần đầu tiên my_function()
được gọi dẫn đến việc gán cùng một giá trị cho thời gian tồn tại của chương trình. Do đó thời lượng lưu trữ tĩnh.
bar
do rand()
không phải là hằng số thời gian biên dịch.