在尝试使用
#ifndef __SOMEFILE_H__
#define __SOMEFILE_H__
...
#endif
和
#pragma once
解决时仍没有解决问题,可能是我没有理解原理。
工程结构:
1208.cpp:
#include "Test.h"
void main()
{
fun();
system("pause");
}
1208_01.cpp:
#include "Test.h"
void fun()
{
printf("%s\n",TEST);
}
Test.h:
#include <stdio.h>
#include <windows.h>
#include "1208_01.cpp"
#define TEST "调用其他文件的函数"
void fun();
在Test.h第一行加 #pragma once 后提示:
改为:
#ifndef __SOMEFILE_H__
#define __SOMEFILE_H__
...
#endif
也是一样的错误。
14 个解决方案
#1
#ifndef TEST_H_
#define TEST_H_
...
...
...
#endif
并去掉头文件中包含的1208_1.cpp
#define TEST_H_
...
...
...
#endif
并去掉头文件中包含的1208_1.cpp
#2
#include "1208_01.cpp" 这就是在作死, 虽然语法上能通过.
一般来说include的只应该是.h文件.
再有.一般来说. 全局函数, 全局变量都不要在.h文件中实现. .h文件中只应该存在声明.
你的问题解决办法:
去掉下面这句
#include "1208_01.cpp"
因为你的fun已经在下面声明了. 编译器会自动去找实现的地方来连接.
一般来说include的只应该是.h文件.
再有.一般来说. 全局函数, 全局变量都不要在.h文件中实现. .h文件中只应该存在声明.
你的问题解决办法:
去掉下面这句
#include "1208_01.cpp"
因为你的fun已经在下面声明了. 编译器会自动去找实现的地方来连接.
#3
头文件最开始加上 #param once
保证你的头文件只编译一遍
保证你的头文件只编译一遍
#4
写错了是 #pragma once
#5
是阿,怎么把CPP都包含进来了?这是不好的设计模式
#6
你把cpp包括进来了,就会重定义啊,头文件只声明不定义的原因就是防止重定义,你要使用1208里面的函数只要弄个头文件定义一下,然后用cpp实现也能包括进来
#7
cpp文件不用包含,你加入工程就行(从截图你已经加入了)
#8
楼主我用你的代码做了下实验
#ifndef _test_
#define _test_
#include <stdio.h>
#include <windows.h>
#include "1208_01.c"
#define TEST "调用其他文件的函数"
void fun();
#endif
问题有两点
1 #include "1208_01.c“ 相当于文本替换,编译1208.c因此这里printf("%s",TEST)与之后的#define TEST "调用其他文件的函数
出现了问题,对调二者位置,
2 已有fun主体的问题,
在你编译了1208.c之后,1208.obj文件中已经包含了fun函数代码,我用dumpbin看的,我于是在工程中删掉1208_01.c,再组建,不编译1208.c之后可以形成.exe文件,运行有打印,证明确实有fun
#ifndef _test_
#define _test_
#include <stdio.h>
#include <windows.h>
#include "1208_01.c"
#define TEST "调用其他文件的函数"
void fun();
#endif
问题有两点
1 #include "1208_01.c“ 相当于文本替换,编译1208.c因此这里printf("%s",TEST)与之后的#define TEST "调用其他文件的函数
出现了问题,对调二者位置,
2 已有fun主体的问题,
在你编译了1208.c之后,1208.obj文件中已经包含了fun函数代码,我用dumpbin看的,我于是在工程中删掉1208_01.c,再组建,不编译1208.c之后可以形成.exe文件,运行有打印,证明确实有fun
#9
是不是在Test.h包含1208_01.cpp后编译,会存在两个fun()函数的定义。
#10
test.h包含1208_01.c后,#include “test.h”这句就会被替换为1208_01.c的内容
#11
CPP文件不需要包含
#12
楼主,你的代码问题出现在#define TEST这一行;
如果代码中多处出现这一行时,编译会出问题,可以把这行删除,然后在Test.h头文件中添加如下行:
如果代码中多处出现这一行时,编译会出问题,可以把这行删除,然后在Test.h头文件中添加如下行:
LINE01: #ifndef __TEST_HEADER_FILE__
LINE02: #define __TEST_HEADER_FILE__
// 定义的其它功能性代码
LINE END: #endif // #define __TEST_HEADER_FILE__
#13
感谢各位,理解了。
#14
再次感谢各位!
#1
#ifndef TEST_H_
#define TEST_H_
...
...
...
#endif
并去掉头文件中包含的1208_1.cpp
#define TEST_H_
...
...
...
#endif
并去掉头文件中包含的1208_1.cpp
#2
#include "1208_01.cpp" 这就是在作死, 虽然语法上能通过.
一般来说include的只应该是.h文件.
再有.一般来说. 全局函数, 全局变量都不要在.h文件中实现. .h文件中只应该存在声明.
你的问题解决办法:
去掉下面这句
#include "1208_01.cpp"
因为你的fun已经在下面声明了. 编译器会自动去找实现的地方来连接.
一般来说include的只应该是.h文件.
再有.一般来说. 全局函数, 全局变量都不要在.h文件中实现. .h文件中只应该存在声明.
你的问题解决办法:
去掉下面这句
#include "1208_01.cpp"
因为你的fun已经在下面声明了. 编译器会自动去找实现的地方来连接.
#3
头文件最开始加上 #param once
保证你的头文件只编译一遍
保证你的头文件只编译一遍
#4
写错了是 #pragma once
#5
是阿,怎么把CPP都包含进来了?这是不好的设计模式
#6
你把cpp包括进来了,就会重定义啊,头文件只声明不定义的原因就是防止重定义,你要使用1208里面的函数只要弄个头文件定义一下,然后用cpp实现也能包括进来
#7
cpp文件不用包含,你加入工程就行(从截图你已经加入了)
#8
楼主我用你的代码做了下实验
#ifndef _test_
#define _test_
#include <stdio.h>
#include <windows.h>
#include "1208_01.c"
#define TEST "调用其他文件的函数"
void fun();
#endif
问题有两点
1 #include "1208_01.c“ 相当于文本替换,编译1208.c因此这里printf("%s",TEST)与之后的#define TEST "调用其他文件的函数
出现了问题,对调二者位置,
2 已有fun主体的问题,
在你编译了1208.c之后,1208.obj文件中已经包含了fun函数代码,我用dumpbin看的,我于是在工程中删掉1208_01.c,再组建,不编译1208.c之后可以形成.exe文件,运行有打印,证明确实有fun
#ifndef _test_
#define _test_
#include <stdio.h>
#include <windows.h>
#include "1208_01.c"
#define TEST "调用其他文件的函数"
void fun();
#endif
问题有两点
1 #include "1208_01.c“ 相当于文本替换,编译1208.c因此这里printf("%s",TEST)与之后的#define TEST "调用其他文件的函数
出现了问题,对调二者位置,
2 已有fun主体的问题,
在你编译了1208.c之后,1208.obj文件中已经包含了fun函数代码,我用dumpbin看的,我于是在工程中删掉1208_01.c,再组建,不编译1208.c之后可以形成.exe文件,运行有打印,证明确实有fun
#9
是不是在Test.h包含1208_01.cpp后编译,会存在两个fun()函数的定义。
#10
test.h包含1208_01.c后,#include “test.h”这句就会被替换为1208_01.c的内容
#11
CPP文件不需要包含
#12
楼主,你的代码问题出现在#define TEST这一行;
如果代码中多处出现这一行时,编译会出问题,可以把这行删除,然后在Test.h头文件中添加如下行:
如果代码中多处出现这一行时,编译会出问题,可以把这行删除,然后在Test.h头文件中添加如下行:
LINE01: #ifndef __TEST_HEADER_FILE__
LINE02: #define __TEST_HEADER_FILE__
// 定义的其它功能性代码
LINE END: #endif // #define __TEST_HEADER_FILE__
#13
感谢各位,理解了。
#14
再次感谢各位!