2017-01-05 10 views
0

Я пытаюсь генерировать имена функций динамически с помощью директив препроцессора (добавьте дополнительный префикс).Динамическое имя функции - Не удается разрешить символ extern

Генерация работает, и когда gcc выводит мне код после препроцессора (gcc -E), gcc сообщает мне, что функция имеет правильное имя.

Но когда я использую эту функцию в коде, gcc выдает ошибку с неразрешенным внешним символом? (Link2019/Link1120)

Я не уверен на 100%, как работает компоновщик, но теоретически gcc должен запускать препроцессор, строить все библиотеки (точнее, сначала прототип и после основного определения?), Поэтому должно быть без проблем? Должен ли я добавить специальный компилятор? Ссылка?

Моя главная:

#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] != '\0') 
    { 
     offset++; 
    } 

    dst[offset + counter] = src[counter]; 
} 

Выход для string.h при компиляции с -E

1> #line 11 "d:\\string.h" 
1> 
1> 
1> 
1> 
1> void mystrcat(char *dst, char *src); 

Спасибо за вашу помощь!

+0

На самом деле, вы не создают динамичную имя функции. – jxh

ответ

2

Директива STRING_FUNCTION_PREFIX определена в main.c, но не в строке .c. Поэтому, когда string.c скомпилирован, замена не происходит. Если вы скомпилируете string.c с gcc -E, вы увидите эффект этого.

Вы должны положить #define STRING_FUNCTION_PREFIX my наверху string.h вместо main.c. Таким образом, любой файл .c, который ему нужен, определил его, и он согласован во всех местах.

1

Вы, кажется, пытается создать эмуляцию шаблонов в C. Если это так, то вы должны относиться содержимое string.c в качестве файла заголовка, который должен быть включен кем-то, что знает, что такое значение STRING_FUNCTION_PREFIX РЕКОМЕНДУЕМЫМ быть. Если содержимое string.c является файлом заголовка, переименуйте его, чтобы сделать это ясным, например, string_template.h.

Затем, вы можете иметь файл mystring.c реализован как:

#define STRING_FUNCTION_PREFIX my 
#include "string_template.h"