Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C] Warning public symbol 
V
    Опции темы
Ak47black
  Дата 9.4.2009, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

Репутация: нет
Всего: 0



Здравствуйте.
Подскажите пожалуйста кто силён в [С]
Есть такой вот код
Main.c
Код

#include <stdio.h>
#include "polinome.h"

int add(int a, int b) {
    if (x != EOF)
        return a + b;
    else return -1;
}

int multiply(int a, int b) {
    if (x != EOF) 
        return a*b;
    else return -1;
}

int main() {
    int sk1,sk2;
    x = 0;
    printf("Vvedite dva cisla:\n");
    x = scanf("%d%d", &sk1, &sk2);
    if (x != EOF) {
        printf("(%d + %d) = %d\n", sk1, sk2, add(sk1, sk2));
        printf("(%d * %d) = %d\n", sk1, sk2, multiply(sk1, sk2));
        printf("(%d + %d)^2 = %d\n", sk1, sk2, (int)squared_sum(sk1, sk2));
    }
    else printf("Proizoshla osibka\n");
    return 0;
}


polinome.c
Код

#include "polinome.h"

double add(double val1, double val2, double val3) {
    ++x;
    return val1 + val2 + val3;
}

double multiply(double val1, double val2) {
    ++x;
    return val1*val2;
}

double squared_sum(double val1, double val2) {
    ++x;
    return add( multiply(val1,val1), 2 * multiply(val1,val2), multiply(val2,val2) );
}

int call_counter(void) {
    return x;
}


polinome.h
Код

int x;

/* return (val1 + val2)^2 */
double squared_sum(double val1, double val2);

/* return the number of times where the polinome library functions were called*/
int call_counter(void);


В CodeGear Rad Studio компилируется и пре этом выдаёт предупреждения на подобии
Цитата

[ILINK32 Warning] Warning: Public symbol '_add' defined in both module

и всё работает.
Но если компилировать с gcc, то некопилируется и пишет 
Цитата

/tmp/ccd3LYIP.o: In function `add':
/tmp/ccd3LYIP.o(.text+0x0): multiple definition of `add'
/tmp/cc6RXMcm.o(.text+0x0): first defined here
/usr/libexec/elf/ld: Warning: size of symbol `add' changed from 38 to 22 in /tmp/ccd3LYIP.o
...

Тоесть как я понимаю тут конфликт изза того что два раза были объявлены функции с одинаковыми адресами.
Вопрос - как тут грамотно сделать для gcc?  smile 
И ещё хочу спросить, существует вродебы какой-то класс Internal, только как он правильно пишется?

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  polinome.zip 0,85 Kb
PM MAIL   Вверх
zim22
Дата 9.4.2009, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(Ak47black @  9.4.2009,  20:20 Найти цитируемый пост)
 существует вродебы какой-то класс Internal, только как он правильно пишется?

каково предназначение этого класса? первый раз слышу.
***
main.c
Код
#include "polinome.h"

/*int add(int a, int b) {
    if (x != EOF)
        return a + b;
    else return -1;
}*/

/*int multiply(int a, int b) {
    if (x != EOF)
        return a*b;
    else return -1;
}*/

int main() {
    int sk1,sk2;
    x = 0;
    printf("Vvedite dva cisla:\n");
    x = scanf("%d%d", &sk1, &sk2);
    if (x != EOF) {
        printf("(%d + %d) = %d\n", sk1, sk2, add(sk1, sk2));
        printf("(%d * %d) = %d\n", sk1, sk2, multiply(sk1, sk2));
        printf("(%d + %d)^2 = %d\n", sk1, sk2, squared_sum(sk1, sk2));
    }
    else printf("Proizoshla osibka\n");
    return 0;
}



polinom.c
Код
#include "polinome.h"

int add2(int val1, int val2, int val3) {
    ++x;
    return val1 + val2 + val3;
}

int add(int a, int b) {
    if (x != EOF)
        return a + b;
    else return -1;
}

int multiply(int val1, int val2) {
    ++x;
    return val1*val2;
}

int squared_sum(int val1, int val2) {
    ++x;
    return add2( multiply(val1,val1),
                2 * multiply(val1,val2),
                 multiply(val2,val2) );
}

int call_counter(void) {
    return x;
}



polinom.h
Код
#include <stdio.h>

int x;

/* return (val1 + val2)^2 */
int squared_sum(int val1, int val2);

/* return the number of times where the polinome library functions were called*/
int call_counter(void);




Это сообщение отредактировал(а) zim22 - 9.4.2009, 20:52


--------------------
PM MAIL   Вверх
Ak47black
Дата 9.4.2009, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

Репутация: нет
Всего: 0



Код

/*int add(int a, int b) {
    if (x != EOF)
        return a + b;
    else return -1;
}*/
/*int multiply(int a, int b) {
    if (x != EOF)
        return a*b;
    else return -1;
}*/

Не  smile. Я зыбал упомянуть но мне немного нетак нужно.
Мне надо сделать чтобы из Main.c вызывались add и multiply которые находятся в нём, а при вызове например squared_sum функции в ней вызывалась уже другая функция add, тоесть не из Main.c, а из polinom.c.

Добавлено через 3 минуты и 6 секунд
Цитата

каково предназначение этого класса? первый раз слышу.

Вродебы она делает функцию или переменную видимой только в модуле где она объявлена.

Это сообщение отредактировал(а) Ak47black - 9.4.2009, 21:09
PM MAIL   Вверх
jonie
Дата 9.4.2009, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118



у вас add определена в двух модулях. добавьте перед ней static, и тогда будет считаться что функция "из модуля где определена"....


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
J0ker
Дата 9.4.2009, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 9
Всего: 14



Цитата(Ak47black @  9.4.2009,  20:20 Найти цитируемый пост)
Тоесть как я понимаю тут конфликт изза того что два раза были объявлены функции с одинаковыми адресами.

не правильно понимаете
конфликт из-за того, что функция с одной сигнатурой была определена (defined) два раза в разных юнитах - линкер не знает какую из них линковать


--------------------
user posted image
PM MAIL   Вверх
Ak47black
Дата 10.4.2009, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

Репутация: нет
Всего: 0



Спасибо вам за помощь.
Я немного непонимал значение static.
Теперь со всем разобрался.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0559 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.