2013-05-17 3 views
2

Я C++ noob. У меня есть файл foo.cpp, который определяет функцию,Если я определяю функцию в файле реализации (.cpp), не определяя ее в файле заголовка, что происходит?

void sort() { 
    // details of sort algorithm 
} 

Я не определил это в соответствующем файле заголовок, но я не получаю ошибки компиляции. Я заметил, что это воспринимается как статический метод. Это так? Что именно я здесь сделал?

EDIT:

Я заметил, что внутри этого метода я не могу использовать это, (например: this-> бар), следовательно, мое предположение, что это статическая функция. Это на самом деле произошло, когда мне нужен «частный» метод, но забыл объявить его в файле заголовка. Существует ли фактическое использование такой функции?

+1

«Что происходит?» Попробуйте и просветите нас также –

+2

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

+0

В вашем названии вы имеете в виду «... * объявление * (не определяющее) его в файле заголовка». – ma11hew28

ответ

1

Это не является невидимым за пределами этой единицы компиляции, он не связан с одной единицы компиляции, это просто определение, которое нуждается в декларации для того, чтобы быть называется. Как и любое другое определение.

wtf.каст:

#include <iostream> 
void f(){ std::cout<< "f();"; } 

omg.cpp:

void f(); // I can declare wherever I use it. 
int main(){ f(); } 

$ g++ wtf.cpp omg.cpp && ./a.out

Выход: f();

1

Вы создали функцию, которая видна только этому модулю компиляции (и другим, которые включают сам источник).

1

Нет, это не воспринимается как статическая функция. Это просто не видно другим отказам от транскрипции, и поэтому вы не можете его использовать.

Разница в отношении статического метода заключается в том, что компоновщик видит эту функцию. Поэтому, если вы определяете функцию с тем же именем в другой единицы перевода, вы, вероятно, либо получите ошибку компоновщика (лучший случай), либо неправильный метод, вызываемый время от времени.

PS: я говорю о функциях вместо методов здесь, потому что в C++ метод, как правило, является частью класса, и вы не можете определить метод класса, если этот метод не объявлен в том, что класс ".

+0

Он не может использовать его * в других единицах перевода *. – Spook

+0

Это утверждение/ответ может быть неточным. Эта функция все еще может использоваться в одном устройстве –

+0

Почему он не может использоваться в других единицах перевода? –

1

Ничего не происходит. Функция будет там и по существу доступна, но без прообразного/прямого объявления другие единицы перевода/части кода не будут знать, что на самом деле там (и на основе уровня оптимизации он может быть исключен из полученного исполняемого кода).

2

Функция аналогична функции, указанной в этой системе перевода. Но вы все равно можете получить доступ к нему из любого места, так как он будет иметь внешнюю связь. так что просто сделайте это:

void foo() 
{ 
    extern void sort(); 

    sort(); 
} 
+0

Предполагаете ли вы, что это C, а не C++? –

+0

работает на обоих языках – Laurijssen

0

Вы только что определили свободную функцию.

Вы можете использовать в файле реализации, учитывая, что декларация выше вызовы (СА «читает» исходный файл сверху вниз):

void fun(){ 
    mysort(); // Compile Error 

void mysort(){} 

void anotherFun(){ 
    mysort(); // Works here 
    } 

Чтобы избавиться от этого граничного эффекта , вы можете добавить прототип функции в начале файла. Я часто использую эту «свободную функцию» для небольших макросов преобразования.

Пример:

char* BigEndianToLitteEndian(char word[], int size); // prototype 

void routine() 
{ 
    .... 
    le = BigEndianToLittleEndian(be, SIZE); 
    .... 

} 

char* BigEndianToLitteEndian(char word[], int size){ // implementation 
    .... 
} 
+1

Я бы не стал использовать 'Crash' как указание ошибки. Он предлагает контекст времени выполнения, но на самом деле это ошибка времени компиляции. – stefan

0

Несмотря на то, что это только в файле реализации, это не статична, если не указано static.

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

См. static function in C, в частности @Stephen_Canon's answer.

0

А также может быть очень плохо, если одна и та же функция определена внутри какого-либо другого файла cpp с той же сигнатурой.

+1

Это не будет плохо, компоновщик поймает это и выбросит ошибку. Только если функции специально объявлены как «inline», «static» или «template» (в этом случае они становятся «inline»), они могут существовать в нескольких единицах компиляции. – Ext3h

+0

Не удалось попробовать. Так приятно слышать :). – zgulser

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