Я предложу возможное частичное объяснение.
@ Manoj Если вы изучите (или сможете предоставить) список сборок для SetCallback, сгенерированный обоими компиляторами, мы можем получить окончательный ответ.
Во-первых, операторы Pascal Couq верны, и Lindydancer показывает, как правильно установить обратный вызов. Мой ответ - только попытка объяснить реальную проблему.
Я думаю, что проблема связана с тем, что Linux и другая платформа используют разные 64-битные модели (см. 64-битные модели в Википедии ). Обратите внимание, что Linux использует LP64 (int является 32-битным). Нам нужно больше деталей на другой платформе. Если это SPARC64, он использует ILP64 (int является 64-битным).
Как я понимаю, проблема наблюдалась только в Linux и исчезла, если вы ввели локальную переменную int. Вы пробовали это с оптимизацией или выключением? Скорее всего, этот хак не будет иметь положительного эффекта при оптимизации.
В обеих 64-битных моделях указатели должны быть 64-битными независимо от того, указывают ли они на код или данные. Однако возможно, что это не так (например, модели с сегментированной памятью); следовательно, предостережения Паскаля и Линдидансера.
Если указатели имеют одинаковый размер, то остается проблема возможного выравнивания стека. Введение локального int (который является 32-битным в Linux) может изменить выравнивание. Это будет иметь эффект, только если void * и указатели на функции имеют разные требования к выравниванию. Сомнительный сценарий.
Тем не менее, различные 64-битные модели памяти, скорее всего, являются причиной того, что вы наблюдали. Вы можете предоставить списки сборок, чтобы мы могли их проанализировать.