Я участвую в одной из этих проблем, когда вы пытаетесь создать минимально возможный двоичный файл, поэтому я строю свою программу без библиотек времени выполнения C или С++ (RTL). Я не ссылаюсь на версию DLL или статическую версию. Я даже не #include
файлы заголовков. У меня это нормально работает.
Некоторые функции RTL, такие как memset()
, могут быть полезны, поэтому я попытался добавить свою собственную реализацию. Он отлично работает в сборках Debug (даже для тех мест, где компилятор генерирует неявный вызов memset()
). Но в версиях Release я получаю сообщение об ошибке, говоря, что я не могу определить внутреннюю функцию. Вы видите, что в версиях Release встроены внутренние функции, а memset()
является внутренним.
Я хотел бы использовать встроенный для memset()
в своих выпусках, поскольку он, вероятно, встроен и меньше и быстрее, чем моя реализация. Но я, похоже, поймаю-22. Если я не определяю memset()
, компоновщик жалуется, что он undefined. Если я его определяю, компилятор жалуется, что я не могу определить внутреннюю функцию.
Кто-нибудь знает правильную комбинацию определения, объявления, #pragma
, а также флагов компилятора и компоновщика, чтобы получить внутреннюю функцию, не занимая накладные расходы RTL?
Visual Studio 2008, x86, Windows XP +.
Чтобы сделать проблему немного более конкретной:
extern "C" void * __cdecl memset(void *, int, size_t);
#ifdef IMPLEMENT_MEMSET
void * __cdecl memset(void *pTarget, int value, size_t cbTarget) {
char *p = reinterpret_cast<char *>(pTarget);
while (cbTarget > 0) {
*p++ = static_cast<char>(value);
--cbTarget;
}
return pTarget;
}
#endif
struct MyStruct {
int foo[10];
int bar;
};
int main() {
MyStruct blah;
memset(&blah, 0, sizeof(blah));
return blah.bar;
}
И я строю вот так:
cl /c /W4 /WX /GL /Ob2 /Oi /Oy /Gs- /GF /Gy intrinsic.cpp
link /SUBSYSTEM:CONSOLE /LTCG /DEBUG /NODEFAULTLIB /ENTRY:main intrinsic.obj
Если я скомпилирую с моей реализацией memset()
, я получаю ошибку компилятора:
error C2169: 'memset' : intrinsic function, cannot be defined
Если я скомпилирую это без моей реализации memset()
, я получаю ошибку компоновщика:
error LNK2001: unresolved external symbol _memset