动态函数名称 - 无法解析外部符号
Dynamic Functionname - Cannot resolve extern symbol
我正在尝试使用预处理器指令动态生成函数名称(添加可选前缀)。
生成工作正常,当 gcc 在预处理器 (gcc -E) 之后向我输出代码时,gcc 告诉我该函数的名称正确。
但是当我在代码中使用这个函数时,gcc 会抛出一个带有未解析的外部符号的错误? (Link2019 / Link1120)
我不是 100% 确定 linker 是如何工作的,但理论上 gcc 应该 运行 预处理器,构建所有库(更确切地说,首先是原型,然后是主要定义? ) 所以应该没有问题吧?
我必须添加一个特殊的编译器选项吗?一个link?
我的主要:
#define _CRT_SECURE_NO_WARNINGS
#define STRING_FUNCTION_PREFIX my // Defining a prefix for my string functions
#include <stdlib.h>
#include <stdio.h>
#include <string.h> // Original string functions
#include "string.h" // My string functions
#define ARRAY_SIZE 50
#define HALLO "HALLO"
#define WELT "WELT"
int main()
{
char src1[ARRAY_SIZE], src2[ARRAY_SIZE], dst1[ARRAY_SIZE], dst2[ARRAY_SIZE];
strcpy(src1, HALLO);
strcpy(dst1, WELT);
strcpy(src2, HALLO);
strcpy(dst2, WELT);
strcat(src1, dst1);
mystrcat(src2, dst2);
return 0;
}
我的string.h
#pragma once
#include <stdlib.h>
#if defined STRING_FUNCTION_PREFIX
#define FUNCTION_PASTER(ARG1,ARG2) ARG1 ## ARG2
#define FUNCTION_EVALUATER(ARG1,ARG2) FUNCTION_PASTER(ARG1, ARG2)
#define FUNCTION_NAME(FUNCTION) FUNCTION_EVALUATER(STRING_FUNCTION_PREFIX, FUNCTION)
#else
#define FUNCTION_NAME(FUNCTION) FUNCTION
#endif
/*
* \brief: Adds the string from src to the destination string
*/
void FUNCTION_NAME(strcat)(char *dst, char *src);
我的string.c
#include "string.h"
void FUNCTION_NAME(strcat)(char *dst, char *src)
{
int counter = 0, offset = 0;
while (dst[offset] != '[=12=]')
{
offset++;
}
dst[offset + counter] = src[counter];
}
使用 -E
编译时 string.h 的输出
1> #line 11 "d:\string.h"
1>
1>
1>
1>
1> void mystrcat(char *dst, char *src);
感谢您的帮助!
STRING_FUNCTION_PREFIX
指令在 main.c 中定义,但未在 string.c 中定义。所以当 string.c 被编译时,替换不会发生。如果你用gcc -E
编译string.c,你会看到这样的效果。
您需要将 #define STRING_FUNCTION_PREFIX my
放在 string.h 的顶部而不是 main.c 中。这样,任何需要它的 .c 文件都定义了它,并且它在所有地方都是一致的。
您似乎试图在 C 中创建模板仿真。如果是这种情况,您应该将 string.c
的内容视为 头文件 需要由知道 STRING_FUNCTION_PREFIX
应该是什么值的人包含。如果 string.c
内容是头文件,请重命名它以使其清楚,例如 string_template.h
.
然后,您可以将文件 mystring.c
实现为:
#define STRING_FUNCTION_PREFIX my
#include "string_template.h"
我正在尝试使用预处理器指令动态生成函数名称(添加可选前缀)。
生成工作正常,当 gcc 在预处理器 (gcc -E) 之后向我输出代码时,gcc 告诉我该函数的名称正确。
但是当我在代码中使用这个函数时,gcc 会抛出一个带有未解析的外部符号的错误? (Link2019 / Link1120)
我不是 100% 确定 linker 是如何工作的,但理论上 gcc 应该 运行 预处理器,构建所有库(更确切地说,首先是原型,然后是主要定义? ) 所以应该没有问题吧? 我必须添加一个特殊的编译器选项吗?一个link?
我的主要:
#define _CRT_SECURE_NO_WARNINGS
#define STRING_FUNCTION_PREFIX my // Defining a prefix for my string functions
#include <stdlib.h>
#include <stdio.h>
#include <string.h> // Original string functions
#include "string.h" // My string functions
#define ARRAY_SIZE 50
#define HALLO "HALLO"
#define WELT "WELT"
int main()
{
char src1[ARRAY_SIZE], src2[ARRAY_SIZE], dst1[ARRAY_SIZE], dst2[ARRAY_SIZE];
strcpy(src1, HALLO);
strcpy(dst1, WELT);
strcpy(src2, HALLO);
strcpy(dst2, WELT);
strcat(src1, dst1);
mystrcat(src2, dst2);
return 0;
}
我的string.h
#pragma once
#include <stdlib.h>
#if defined STRING_FUNCTION_PREFIX
#define FUNCTION_PASTER(ARG1,ARG2) ARG1 ## ARG2
#define FUNCTION_EVALUATER(ARG1,ARG2) FUNCTION_PASTER(ARG1, ARG2)
#define FUNCTION_NAME(FUNCTION) FUNCTION_EVALUATER(STRING_FUNCTION_PREFIX, FUNCTION)
#else
#define FUNCTION_NAME(FUNCTION) FUNCTION
#endif
/*
* \brief: Adds the string from src to the destination string
*/
void FUNCTION_NAME(strcat)(char *dst, char *src);
我的string.c
#include "string.h"
void FUNCTION_NAME(strcat)(char *dst, char *src)
{
int counter = 0, offset = 0;
while (dst[offset] != '[=12=]')
{
offset++;
}
dst[offset + counter] = src[counter];
}
使用 -E
编译时 string.h 的输出1> #line 11 "d:\string.h"
1>
1>
1>
1>
1> void mystrcat(char *dst, char *src);
感谢您的帮助!
STRING_FUNCTION_PREFIX
指令在 main.c 中定义,但未在 string.c 中定义。所以当 string.c 被编译时,替换不会发生。如果你用gcc -E
编译string.c,你会看到这样的效果。
您需要将 #define STRING_FUNCTION_PREFIX my
放在 string.h 的顶部而不是 main.c 中。这样,任何需要它的 .c 文件都定义了它,并且它在所有地方都是一致的。
您似乎试图在 C 中创建模板仿真。如果是这种情况,您应该将 string.c
的内容视为 头文件 需要由知道 STRING_FUNCTION_PREFIX
应该是什么值的人包含。如果 string.c
内容是头文件,请重命名它以使其清楚,例如 string_template.h
.
然后,您可以将文件 mystring.c
实现为:
#define STRING_FUNCTION_PREFIX my
#include "string_template.h"