2015-04-26 2 views
3

Я пытаюсь понять, как использовать структуры как списки в C++. Я придумал кусок кода, который к моему understeanding не должно привести какие-либо ошибки, но он сделал ..Ошибка при попытке использовать структуры в C++

Мой код заключается в следующем:

struct item { 
int data; 
struct item *next; 
}; 

struct item *begin = NULL; 

void add(int x) { 
    struct item *a = new struct item(); 
    a->data = x; 
    a->next = begin; 
    begin = a; 
} 

int main() { 

    add(2); 
    printf("%d\n", begin->data); 

    return 0; 
} 

и это дает мне это:

Undefined symbols for architecture x86_64: 
"operator new(unsigned long)", referenced from: 
    add(int) in structtest-f49486.o 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

Я использую GCC внутри моего терминала Mac для запуска своего кода. Я раньше этого не видел. Я обнаружил, что ошибки нет, когда я удаляю линию

struct item *a = new struct item(); 

Может ли кто-нибудь сказать мне, что здесь не так?

Спасибо,

Merijn

+0

в C++ вам не нужно использовать ключевое слово struct каждый раз, когда вы используете его тип – Krab

+0

Помимо точки объявления, '' '' struct', 'union',' enum' и 'class' могут быть опущены в C++, и в «новом» выражении его даже нужно опустить. Пожалуйста, проверьте некоторые примеры из учебника C++. –

ответ

9

Использование g++ не gcc. Похоже, он пытается связать ваш код на C++ как код C.

GCC такой странный. Когда вы используете g++ по адресу link, он тихо добавляет библиотеки поддержки C++, такие как тот, который определяет значение по умолчанию operator new.

И да, он «забывает», что он просто скомпилировал код как C++. Не спрашивай меня, почему.


Что касается clang и gcc, вот что я вижу на моем Mac:

$ gcc --version 
gcc (MacPorts gcc48 4.8.4_0) 4.8.4 
Copyright (C) 2013 Free Software Foundation, Inc. 
This is free software; see the source for copying conditions. There is NO 
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 

$ type -a gcc 
gcc is /opt/local/bin/gcc 
gcc is /usr/bin/gcc 
$ /usr/bin/gcc --version 
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1 
Apple LLVM version 6.1.0 (clang-602.0.49) (based on LLVM 3.6.0svn) 
Target: x86_64-apple-darwin14.3.0 
Thread model: posix 
$ ls -lF /usr/bin/gcc 
-rwxr-xr-x 1 root wheel 14160 Sep 29 2014 /usr/bin/gcc* 
$ ls -lF /usr/bin/g++ 
-rwxr-xr-x 1 root wheel 14160 Sep 29 2014 /usr/bin/g++* 
$ file /usr/bin/gcc 
/usr/bin/gcc: Mach-O 64-bit executable x86_64 
$ file /usr/bin/g++ 
/usr/bin/g++: Mach-O 64-bit executable x86_64 
$ diff /usr/bin/g++ /usr/bin/gcc 
Binary files /usr/bin/g++ and /usr/bin/gcc differ 

Обратите внимание, что у меня есть MacPorts установлен, есть реальный GCC 4.8 установлен через него, и настроили его «заменить» Apple «gcc». BTW, Apple gcc не является символической ссылкой.

+0

Из последней строки сообщения об ошибке кажется, что clang, - not gcc/g ++ - был вызван для стадии компоновщика. –

+0

@MichelBillaud Я думал то же самое, но я думаю, что Mac «gcc» - это просто символическая ссылка на «clang» в любом случае и «g ++» на «clang ++», что, конечно же, необходимо. – davmac

+0

Да, на Mac, 'gcc' на самом деле выполняет' clang', который пытается действовать как GCC-like, насколько это возможно, но не всегда получается. –

Смежные вопросы