error c2129:静态函数已声明但未定义
今天在做一个c函数暴露给lua 时,出现这个问题。
大概代码是这样的,
头文件:
#ifndef LEVEL_DESIGNER_H
#define LEVEL_DESIGNER_H
extern "C" {
#include "lualib.h"
#include "tolua_fix.h"
} static int saveFileDialog(lua_State *tolus_S);
static int openFileDialog(lua_State *tolus_S); int open_windows_lua(lua_State *tolus_S); #endif
源文件:
#include "LevelDesignerUtils.h" #include <afxwin.h> // MFC 核心组件和标准组件
#include <afxext.h> // MFC 扩展 #include <afxdisp.h> // MFC 自动化类 //wchar to char
void TC2C(const PTCHAR tc, char * c)
{
#if defined(UNICODE)
WideCharToMultiByte(CP_ACP, , tc, -, c, wcslen(tc), , );
c[wcslen(tc)] = ;
#else
lstrcpy((PTSTR)c, (PTSTR)tc);
#endif
} static int openFileDialog(lua_State *tolus_S)
{
// TODO: 在此添加命令处理程序代码
CFileDialog *dlg = new CFileDialog(true, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, _T("json文件(*.json)|*.json|配置文件(*.dat)|*.dat|所有文件(*.*)|*.*||"));
INT_PTR nResponse = dlg->DoModal();
CString filPath = "";
if (IDCANCEL == nResponse)
{
delete dlg;
}
else if (IDOK == nResponse)
{
filPath = dlg->GetPathName();
delete dlg;
}
char filepathc[MAX_PATH];
TC2C(filPath.GetBuffer(), filepathc);
lua_pushstring(tolus_S, filepathc);
return ;
} static int saveFileDialog(lua_State *tolus_S)
{
CFileDialog *dlg = new CFileDialog(false, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, _T("json文件(*.json)|*.json|配置文件(*.dat)|*.dat|所有文件(*.*)|*.*||"));
INT_PTR nResponse = dlg->DoModal();
CString filPath = "";
if (IDCANCEL == nResponse)
{
delete dlg;
}
else if (IDOK == nResponse)
{
filPath = dlg->GetPathName();
delete dlg;
}
char filepathc[MAX_PATH];
TC2C(filPath.GetBuffer(), filepathc);
lua_pushstring(tolus_S, filepathc);
return ;
} int open_windows_lua(lua_State *tolus_S)
{
lua_register(tolus_S, "win_openFileDialog", openFileDialog);
lua_register(tolus_S, "win_saveFileDialog", saveFileDialog);
return ;
}
后来翻阅,查出原因:
静态函数只能在声明它的文件当中可见,不能被其他文件所调用,也就是说静态函数只能在声名它的文件中调用,在其他文件里是不能被调用的。
当然,其实我这里在头文件里做静态函数的声明也是完全没有必要的。去除后,就可以了。
原文链接:https://www.cnblogs.com/JhonKing/p/5736059.html
error c2129:静态函数已声明但未定义的更多相关文章
- 多.h项目出现的问题:使用了预编译头依然出现error LNK2005:***obj已在***obj中定义与c++ error C2011: “xxx”:“class”类型重定义解决办法
使用了预编译头依然出现error LNK2005:***obj已在***obj中定义 造成该问题的可能性比较多,本人将在今后遇到时添加进来,今天先放出本人遇到的一种情况. 多重包含含有变量定义的.h文 ...
- 利用try-catch判断变量是已声明未赋值还是未声明
目的是如果一个变量是已声明未赋值,就可以直接赋值,并且不能改变变量的作用域: 如果未声明的话,就重新声明, 在网上搜了下,常见的方法是if(typeof(a)=='undefined'){var a= ...
- 利用try-catch判断变量是已声明未声明还是未赋值
原文 利用try-catch判断变量是已声明未声明还是未赋值 这篇文章主要介绍了利用try-catch判断变量是已声明未赋值还是未声明,需要的朋友可以参考下 目的是如果一个变量是已声明未赋值,就可以直 ...
- ReferenceError: Error #1065: 变量 dataGridArray 未定义
1.错误描述 ReferenceError: Error #1065: 变量 dataGridArray 未定义. at global/flash.utils::getDefinitionByName ...
- 【JavaScript】如何判断一个对象是未定义的?(已解决)
JavaScript中,如果使用了一个未定义的变量,会有这样的错误提示:XXX未定义. 代码中,怎样才能判定一个对象是否定义了呢? 使用 typeof 示例: if("undefined& ...
- VS2013 ERROR SCRIPT5009: “WebForm_AutoFocus”未定义
提示错误: <script type="text/javascript">//<![CDATA[WebForm_AutoFocus('txtcUserID');/ ...
- [js]变量声明、函数声明、函数定义式、形参之间的执行顺序
一.当函数声明和函数定义式(变量赋值)同名时 function ledi(){ alert('ledi1'); }; ledi(); var ledi = function (){ alert('le ...
- vue.js数据可以在页面上渲染成功却总是警告提示某个字段“undefined”未定义
最近在开发公司的一个后端管理系统,用的是比较流行的vue框架.在开发过程中,总是出现各种各样的报错问题,有警告的,有接口不通的,有自己马虎造成的低级错误的等等,这些错误在一些老司机面前分分钟解决,但今 ...
- VS2110。VC++编译错误"error LNK2005: 已经在 XXX.obj 中定义的问题"
有时候我们会在头文件当中定义一些全局变量或者全局函数,这种做法会比较方便,但有时候会出现“编译错误"error LNK2005: 已经在 XXX.obj 中定义的问题"的链接问题. ...
随机推荐
- oracle中的异常处理方法
异常处理create or replace procedure prc_get_sex (stuname student.name%type) as stusex student.sex%type; ...
- Java-性能调优-理解GC日志
[ ~]# cat gc.log.0 | grep 'Full GC' 1.652: [Full GC (System) 1.652: [CMS: 0K->21718K(262144K), 0. ...
- spring cloud要点简介及常用组件
spring cloud基于spring boot spring cloud是通过包装其他技术框架实现的,例如OSS组件,实现了一套通过基于注解.java配置和基于模板开发的微服务框架. spring ...
- 修改Linux登录提示信息
佛祖保佑式 cat >> /etc/profile.d/message.sh << END echo -e "\033[33;40;5m _ooOoo_ O88888 ...
- Centos6优化系统服务脚本
#!/bin/bash SysVer=`cat /etc/redhat-release | awk -F'release' '{print $2}' | awk -F'[ .]+' '{print $ ...
- ubuntu搭建tiny4412环境【学习笔记】
一.安装完系统之后需要执行如下步骤 1.sudo apt-get update 更新软件源 2.sudo apt-get install vsftpd openssh-server nfs-kerne ...
- static、final和finalize详解
一.static 修饰符 数据共享 成员变量(实例变量)和静态变量(类变量)的区别 两个变量的生命周期不同 成员变量随对象的创建而存在,随对象被回收而释放 静态变量随类的加载而存在,随类的消失而消失 ...
- GDB操作基本命令
GDB操作基本命令 1 打开文件及退出操作 shell下输入 gdb filename : 打开单个文件 gdb filename -q: 打开单个文件,屏蔽掉GDB自带的说明信息 gdb下输入qui ...
- canvas drawimage绘制图像出错(默认canvas300*150)解决办法
今天在开发中,再一次踩了以前踩过的坑,写完程序在这里写一下,分享给大家也避免再次遇坑. //默认的canvas <canvas id ="canvas"></ca ...
- GTID主从 与 传统主从复制
一.主从复制 1.)普通主从复制: 普通主从复制主要是基于二进制日志文件位置的复制,因此主必须启动二进制日志记录并建立唯一的服务器ID,复制组中的每个服务器都必须配置唯一的服务器ID.如果您省略ser ...