В чем разница между внешними переменными в C и C ++? - PullRequest
0 голосов
/ 05 января 2019

b.c не скомпилируется, но b.cpp может быть скомпилировано. Я не совсем понимаю разницу extern между C и C ++. Кто-нибудь может помочь объяснить, почему b.c не работает, а b.cpp работает? Спасибо.

$ cat b.c 

extern int b;
int a = b;
$ gcc -g -Wall -pedantic -c -o b.o b.c
b.c:4:9: error: initializer element is not a compile-time constant
int a = b;
        ^
1 error generated.
$ cat b.cpp 

extern int b;
int a = b;
$ g++ -g -Wall -pedantic -c -o b.o b.cpp
$ ls -g b.o 
-rw-r--r-- 1 staff 2640 Jan  5 10:22 b.o

Ответы [ 3 ]

0 голосов
/ 05 января 2019

Это не внешняя проблема.

Ошибка «элемент инициализатора не является постоянным» при попытке инициализировать переменную с помощью const

В языке C объекты со статической продолжительностью хранения должны инициализироваться с помощью константных выражений или с помощью агрегатных инициализаторов, содержащих константные выражения.

0 голосов
/ 05 января 2019

Нет существенной разницы между extern переменными в C и C ++. Что отличается, это правило для действительных инициализаторов. В Си инициализатор переменной со статической продолжительностью хранения должен быть постоянной времени компиляции . В C ++ это может быть практически любое выражение (включая сложный вызов функции).

0 голосов
/ 05 января 2019

Речь не о внешних переменных. В C переменные со статическим хранилищем должны иметь постоянные инициализаторы. В С ++ их может быть практически любое. Разница в том, что объекты C ++ имеют конструкторы, и объект можно инициализировать практически любым способом (например, с помощью вызова метода или функции).

в C ++ возможна такая инициализация:

#include <string.h>

volatile char s[] = "sdfsasdf";

size_t size = strlen((char *)s);
...