Tôi đã khai báo một biến theo cách này:
int i = 0;
Tôi nhận được cảnh báo:
ISO C90 cấm các khai báo và mã hỗn hợp
Làm thế nào tôi có thể sửa chữa nó?
Tôi đã khai báo một biến theo cách này:
int i = 0;
Tôi nhận được cảnh báo:
ISO C90 cấm các khai báo và mã hỗn hợp
Làm thế nào tôi có thể sửa chữa nó?
-std=c99
).
Câu trả lời:
Tôi nghĩ bạn nên chuyển phần khai báo biến lên đầu khối. I E
{
foo();
int i = 0;
bar();
}
đến
{
int i = 0;
foo();
bar();
}
{foo(); {int i=0; bar();}}
Cho đến trước tiêu chuẩn C99, tất cả các khai báo phải đứng trước bất kỳ câu lệnh nào trong một khối:
void foo()
{
int i, j;
double k;
char *c;
// code
if (c)
{
int m, n;
// more code
}
// etc.
}
C99 được phép trộn các khai báo và câu lệnh (như C ++). Nhiều trình biên dịch vẫn mặc định C89, và một số trình biên dịch (chẳng hạn như Microsoft) không hỗ trợ C99 ở tất cả .
Vì vậy, bạn sẽ cần phải làm như sau:
Xác định xem trình biên dịch của bạn có hỗ trợ C99 trở lên hay không; nếu có, hãy cấu hình nó để nó biên dịch C99 thay vì C89;
Nếu trình biên dịch của bạn không hỗ trợ C99 hay muộn, bạn sẽ hoặc là cần phải tìm một trình biên dịch khác nhau mà không hỗ trợ nó, hoặc viết lại mã của bạn để tất cả các tờ khai đến trước bất kỳ báo cáo trong khối.
Chỉ cần sử dụng một trình biên dịch (hoặc cung cấp cho nó các đối số mà nó cần) để nó biên dịch cho phiên bản mới hơn của tiêu chuẩn C, C99 hoặc C11. Ví dụ: đối với dòng trình biên dịch GCC -std=c99
.
-std=gnu89
được sử dụng khi biên dịch mô-đun nhân linux.
Để chẩn đoán điều gì thực sự gây ra lỗi, trước tiên tôi sẽ cố gắng loại bỏ = 0
Nếu lỗi xảy ra, thì rất có thể phần khai báo đi sau mã.
Nếu không có lỗi, thì nó có thể liên quan đến cờ biên dịch / thực thi tiêu chuẩn C HOẶC ... thứ gì đó khác.
Trong mọi trường hợp, hãy khai báo biến ở đầu phạm vi hiện tại. Sau đó, bạn có thể khởi tạo nó một cách riêng biệt. Thật vậy, nếu biến này xứng đáng với phạm vi riêng của nó - hãy phân tách định nghĩa của nó trong {}.
Nếu OP có thể làm rõ bối cảnh, thì một phản ứng có định hướng hơn sẽ theo sau.
-Wdeclaration-after-statement
ví dụ có thể tái tạo tối thiểu
C chính
#!/usr/bin/env bash
set -eux
cat << EOF > main.c
#include <stdio.h>
int main(void) {
puts("hello");
int a = 1;
printf("%d\n", a);
return 0;
}
EOF
Đưa ra cảnh báo:
gcc -std=c89 -Wdeclaration-after-statement -Werror main.c
gcc -std=c99 -Wdeclaration-after-statement -Werror main.c
gcc -std=c89 -pedantic -Werror main.c
Đừng đưa ra cảnh báo:
gcc -std=c89 -pedantic -Wno-declaration-after-statement -Werror main.c
gcc -std=c89 -Wno-declaration-after-statement -Werror main.c
gcc -std=c99 -pedantic -Werror main.c
gcc -std=c89 -Wall -Wextra -Werror main.c
# https://stackoverflow.com/questions/14737104/what-is-the-default-c-mode-for-the-current-gcc-especially-on-ubuntu/53063656#53063656
gcc -pedantic -Werror main.c
Cảnh báo:
main.c: In function ‘main’:
main.c:5:5: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement]
int a = 1;
^~~
Đã thử nghiệm trên Ubuntu 16.04, GCC 6.4.0.
-pedantic
hoặc-std=c89
, trong trường hợp đó, bạn có thể biên dịch-std=gnu99
nếu muốn.