2015-02-06 4 views
0

Это мой код. У меня есть file1.c и file2.c. Я хочу вызвать СООБЩЕНИЕ из файла file2.c, но я не могу это сделать. Я новичок в C, поэтому я действительно не знаю, что делать. Я уже исследовал, но, похоже, не могу найти конкретного ответа. Спасибо.Вызов #define из другого файла

#define MESSAGE "this is message!" 

helloworld(){ 
    printf("%s",MESSAGE); 
    getch(); 
    } 

#include <stdio.h> 
#include <stdlib.h> 
#include <conio.h> 
#include "file2.c" 

int main(void) 
{ 
    helloworld(); 
} 
+0

'#include" file2.c "' неверен. Всегда лучше включать '# define' в '.h' файлы. –

+0

Вы имеете в виду 'void helloworld() {'? –

ответ

0

Вы должны положить #define в .h файл и включить его в .c файлы, в которых вы хотите использовать его.

1

В вашем file1.c, MESSAGE препроцессор макросов, что означает, что текст MESSAGE будет заменена строкой "this is message!". Он не отображается за пределами файла. Это связано с тем, что в C translation units являются конечными входами в компилятор, а в единицах трансляции ss все макросы препроцессора заменены токенами соответствующего аргумента.

Если вы хотите иметь общую переменную, вы должны объявить переменную как extern в файле заголовка .h, а затем #include файл, в котором вы должны его использовать.

см Compiling multiple C files in a program

0

Вот код, попробуйте следующее:

В file1.c

#define FILE1_C 
#include "file1.h" 

helloworld() 
{ 
    printf("%s",MESSAGE); 
    getch(); 
} 

В file2.c

#include <stdio.h> 
#include <stdlib.h> 
#include <conio.h> 
#include "file1.h" 

int main(void) 
{ 
    helloworld(); 
} 

В File1.h

#ifdef FILE1_C 
#define MESSAGE "this is message!" 
#define EXTERN 
#else 
#define EXTERN extern 
#endif 


EXTERN helloword() 
2

Есть несколько неправильных представлений, которые у вас есть: Прежде всего концепция «вызова» макроса. Это невозможно, даже если макрос выглядит как функция, это не функция, а макросы фактически не обрабатываются компилятором. Вместо этого макросы являются частью отдельного языка, который обрабатывается preprocessor, который берет исходный файл и модифицирует его для генерации translation unit, который видит компилятор. (Для получения дополнительной информации о фазах разности «компиляции» см. Например, this reference.)

Препроцессор делает это, в основном делая замену поиска во входном исходном файле: когда он видит макрос «вызов», он просто заменяет это с «телом» макроса. Когда он видит директиву #include, он предварительно обрабатывает файл, а затем помещает содержимое вместо директивы.

Так что в вашем коде, когда препроцессор видит макрос MESSAGE, он буквально заменяется на "this is message!". Фактический компилятор вообще не видит MESSAGE, он видит только строковый литерал.


Другим заблуждением является то, как вы используете #include директиву. Вы не должны использовать его, чтобы включить источник файлов. Вместо этого вы скомпилируете исходные файлы отдельно (что создает объектные файлы), а затем link сгенерированные файлы объектов вместе с любыми библиотеками, необходимыми для формирования окончательного исполняемого файла.

Чтобы решить проблему с макросами (и другими объявлениями), доступными для всех исходных файлов, вы используете файлы заголовков. Они похожи на исходные файлы, но содержат только объявления и макросы. Затем вы включаете заголовочный файл в оба исходных файла, и оба исходных файла будут знать о объявлениях и макросах, доступных в файле заголовка.

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

Файл заголовка, например. header.h:

// First an include guard (see e.g. https://en.wikipedia.org/wiki/Include_guard) 
#ifndef HEADER_H 
#define HEADER_H 

// Define the macro, if it needs to be used by all source files 
// including this header file 
#define MESSAGE "this is message!" 

// Declare a function prototype so it can be used from other 
// source files 
void helloworld(); 

#endif 

Основной исходный файл, например. main.c:

// Include a system header file, to be able to use the `printf` function 
#include <stdio.h> 

// Include the header file containing common macros and declarations 
#include "header.h" 

int main(void) 
{ 
    // Use the macro 
    printf("From main, MESSAGE = %s\n", MESSAGE); 

    // Call the function from the other file 
    helloworld(); 
} 

Другой файл, например hello.c:

// Include a system header file, to be able to use the `printf` function 
#include <stdio.h> 

// Include the header file containing common macros and declarations 
#include "header.h" 

void helloworld(void) 
{ 
    printf("Hello world!\n"); 
    printf("From helloworld, MESSAGE = %s\n", MESSAGE); 
} 

Теперь, если вы используете компилятор командной строки, как gcc или clang, то вы можете просто построить все это, делая, например,

 
$ gcc -Wall main.c hello.c -o myhello 

Эта команда будет принимать два исходные файлы, main.c и hello.c и запустить препроцессор и компилятор на них для создания (временных) файлов объектов. Эти объектные файлы затем связаны вместе со стандартной библиотекой C для формирования программы myhello (это то, что делает опция -o, называет выходной файл).

Вы можете запустить myhello:

 
$ ./myhello 
From main, MESSAGE = this is message! 
Hello world! 
From helloworld, MESSAGE = this is message! 
0

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

file1.h

#ifndef _FILE1_H 
#define _FILE1_H 

#define MESSAGE "this is message!" 
extern void helloworld(); 

#endif 

file1.c

#include "file1.h" 

helloworld() 
{ 
    printf("%s",MESSAGE); 
    getch(); 
} 

file2.c

#include <stdio.h> 
#include <stdlib.h> 
#include <conio.h> 
#include "file1.h" 

int main(void) 
{ 
    helloworld(); 
return 0; 
} 

Для компиляции

НКУ -Wall file1.c file2.c -o myprog

./myprog

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