Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.07.2011, 17:25   #1
McLeod
Новичок
Джуниор
 
Регистрация: 31.07.2011
Сообщений: 5
По умолчанию Библиотеки C и языка С++

Всем привет! Можете ответить, почему в программу на C можно вставлять функции из C++? Например, функция int mkdir(char *) из заголовочного файла C++ direct.h спокойно работает на C. Не путать c int mkdir(const char *, mode_t) из библиотеки C POSIX sys/stat.h! При написании программы на C я не могу добавить direct.h, потому что он из C++, поэтому я сделал так:
Код:
int mkdir (char *);
int main ()
{
	mkdir ("/home/DK/NewDir");
	return 0;
}
и все заработало. Я не понимаю ПОЧЕМУ.
McLeod вне форума Ответить с цитированием
Старый 31.07.2011, 17:44   #2
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,336
По умолчанию

2McLeod
и в реале ты скорей всего вызываешь как раз int mkdir(const char *, mode_t). ибо линковщику пофиг на колво и типы агрументов, он просто нашел имя mkdir и его использует. в сях ты даже можешь не объявить прототип функции, можешь просто написать

Код:
int main ()
{
	mkdir ("/home/DK/NewDir");
	return 0;
}
компилятор ругнется, что не знает, что такое mkdir, но если линковщик найдет этот символ - все будет работать (в твоем случае не так, как ты ожидаешь, ибо в качестве параметра mode_t придет мусор)

пс. это С, детка
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance

Последний раз редактировалось pproger; 31.07.2011 в 17:47.
pproger вне форума Ответить с цитированием
Старый 31.07.2011, 17:50   #3
McLeod
Новичок
Джуниор
 
Регистрация: 31.07.2011
Сообщений: 5
По умолчанию

Теперь написал так:
Код:
#include <sys/stat.h>
int main ()
{
	mkdir ("/home/DK/NewDir");
	return 0;
}
В итоге ошибка error: too few arguments to function 'mkdir'
/usr/include/sys/stat.h:321:12: note: declared here

Так что не все так просто.
McLeod вне форума Ответить с цитированием
Старый 31.07.2011, 17:53   #4
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,336
По умолчанию

2McLeod
правильно, потому что в области видимости появилось объявление функции int mkdir(const char *, mode_t) ! естественно, теперь от тебя компилятор будет требовать ПОЛНОГО совпадения кол-ва и типа аргументов

в случае же
Код:
int main ()
{
	mkdir ("/home/DK/NewDir");
	return 0;
}
(без каких либо инклудов) компилер ничего не знает о функции mkdir, он надеется, что программист сам ее правильно будет использовать и соберет код с подключением библиотеки, в которой содержится эта функция, чтоб линкер ее нашел.

в с++ такое не прокатывает потому, что имя функции кореллируется с набором и типами ее аргументов (перегрузка). т.е линкеру не будет доступно имя mkdir, он увидит mkdit_blabla1 (функция с 1 параметром), mkdir_blabla2 (функция с двумя параметрами). в сях перегрузки нет, поэтому линкер видит именно mkdir, ничего не зная о ее параметрах.
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance

Последний раз редактировалось pproger; 31.07.2011 в 17:57.
pproger вне форума Ответить с цитированием
Старый 31.07.2011, 17:56   #5
McLeod
Новичок
Джуниор
 
Регистрация: 31.07.2011
Сообщений: 5
По умолчанию

Теперь понятно, спасибо! Кстати папка создалась с правами d--xr--r-t

Еще где можно подробнее узнать про то каким образом линковщик ищет функцию.

Последний раз редактировалось Stilet; 31.07.2011 в 19:18.
McLeod вне форума Ответить с цитированием
Старый 31.07.2011, 17:59   #6
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,336
По умолчанию

2McLeod
это случайность, яж говорю, там будет мусор

Цитата:
dr-xr----- 2 pproger pproger 4.0K Jul 31 21:04 123
Цитата:
Сообщение от McLeod Посмотреть сообщение
Еще где можно подробнее узнать про то каким образом линковщик ищет функцию.
я же сказал, по имени. во всех подключенных динамических/статических библиотеках

пс. да и вообще, почему strace не используешь?
Код:
int main()
{
    mkdir("123");
    return 0;
}
Цитата:
$ strace ./main
execve("./main", ["./main"], [/* 41 vars */]) = 0
brk(0) = 0x9c3b000
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb773d000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("/home/viper/sqllib/lib32/tls/i686/sse2/libm.so.6", O_RDONLY) = -1 ENOENT (No such file or directory)
stat64("/home/viper/sqllib/lib32/tls/i686/sse2", 0xbfa6d3ec) = -1 ENOENT (No such file or directory)
open("/home/viper/sqllib/lib32/tls/i686/libm.so.6", O_RDONLY) = -1 ENOENT (No such file or directory)
stat64("/home/viper/sqllib/lib32/tls/i686", 0xbfa6d3ec) = -1 ENOENT (No such file or directory)
open("/home/viper/sqllib/lib32/tls/sse2/libm.so.6", O_RDONLY) = -1 ENOENT (No such file or directory)
stat64("/home/viper/sqllib/lib32/tls/sse2", 0xbfa6d3ec) = -1 ENOENT (No such file or directory)
open("/home/viper/sqllib/lib32/tls/libm.so.6", O_RDONLY) = -1 ENOENT (No such file or directory)
stat64("/home/viper/sqllib/lib32/tls", 0xbfa6d3ec) = -1 ENOENT (No such file or directory)
open("/home/viper/sqllib/lib32/i686/sse2/libm.so.6", O_RDONLY) = -1 ENOENT (No such file or directory)
stat64("/home/viper/sqllib/lib32/i686/sse2", 0xbfa6d3ec) = -1 ENOENT (No such file or directory)
open("/home/viper/sqllib/lib32/i686/libm.so.6", O_RDONLY) = -1 ENOENT (No such file or directory)
stat64("/home/viper/sqllib/lib32/i686", 0xbfa6d3ec) = -1 ENOENT (No such file or directory)
open("/home/viper/sqllib/lib32/sse2/libm.so.6", O_RDONLY) = -1 ENOENT (No such file or directory)
stat64("/home/viper/sqllib/lib32/sse2", 0xbfa6d3ec) = -1 ENOENT (No such file or directory)
open("/home/viper/sqllib/lib32/libm.so.6", O_RDONLY) = -1 ENOENT (No such file or directory)
stat64("/home/viper/sqllib/lib32", {st_mode=S_IFDIR|0755, st_size=12288, ...}) = 0
open("/etc/ld.so.cache", O_RDONLY) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=68898, ...}) = 0
mmap2(NULL, 68898, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb772c000
close(3) = 0
open("/lib/libm.so.6", O_RDONLY) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\ 0\3\0\1\0\0\0\2204\0\0004\0\0\0"... , 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=149340, ...}) = 0
mmap2(NULL, 151680, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb7706000
mmap2(0xb772a000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE , 3, 0x23) = 0xb772a000
close(3) = 0
open("/home/viper/sqllib/lib32/libc.so.6", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/lib/libc.so.6", O_RDONLY) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\ 0\3\0\1\0\0\0 n\1\0004\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=1409520, ...}) = 0
mmap2(NULL, 1415560, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb75ac000
mmap2(0xb7700000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE , 3, 0x154) = 0xb7700000
mmap2(0xb7703000, 10632, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS , -1, 0) = 0xb7703000
close(3) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb75ab000
set_thread_area({entry_number:-1 -> 6, base_addr:0xb75ab6c0, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0
mprotect(0xb7700000, 8192, PROT_READ) = 0
mprotect(0xb772a000, 4096, PROT_READ) = 0
mprotect(0x8049000, 4096, PROT_READ) = 0
mprotect(0xb775b000, 4096, PROT_READ) = 0
munmap(0xb772c000, 68898) = 0
mkdir("123", 026735146540) = 0
exit_group(0) = ?
показано, что вызывается, какие параметры передаются, что вернуло
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance

Последний раз редактировалось Stilet; 31.07.2011 в 19:27.
pproger вне форума Ответить с цитированием
Старый 31.07.2011, 18:07   #7
McLeod
Новичок
Джуниор
 
Регистрация: 31.07.2011
Сообщений: 5
По умолчанию

Цитата:
Сообщение от pproger Посмотреть сообщение
я же сказал, по имени. во всех подключенных динамических/статических библиотеках
Я имел ввиду более подробно. Нашел сейчас у Страуструпа. Но вообще спасибо за помощь.
McLeod вне форума Ответить с цитированием
Старый 31.07.2011, 18:10   #8
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,336
По умолчанию

2McLeod
у страуструпа ничего подробного по этой теме нет. если не собираешься линкер писать, этой информации достаточно. более подробно видимо тут
но руки не дошли почитать
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 31.07.2011, 18:10   #9
McLeod
Новичок
Джуниор
 
Регистрация: 31.07.2011
Сообщений: 5
По умолчанию

Цитата:
Сообщение от pproger Посмотреть сообщение
пс. да и вообще, почему strace не используешь?
Я новичок в Линуксе, недавно поставил, т.к. антивирус комп тормозил.
McLeod вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Зависимость библиотеки от библиотеки ds.Dante C# (си шарп) 2 07.07.2011 12:55
смена языка Dimarik Visual C++ 2 28.01.2011 22:26
Циклы языка С++ ( saammy Общие вопросы C/C++ 8 29.11.2010 21:49
Выбор языка blackz Свободное общение 10 15.05.2010 17:07
Сохранение языка Dop Общие вопросы Delphi 5 07.08.2009 18:31